uniapp调用原生android 方法,简单教程

大步骤:

 

1:打包android原生sdk (例如厂家给了jar 或者so文件)

首先下载uniapp封装好的原生项目,下载地址官方已经给出:官方教程 

下载地址

  • UniPlugin-Hello-AS工程请在App离线SDK中查找
  • 点击Android Studio菜单选项File--->New--->Import Project。

 

 

 

 导入项目

 

 

 

  • 导入选择UniPlugin-Hello-AS工程,点击OK! 等待工程导入完毕。

 

 

 

 

根据官方介绍有两类扩展插件 一个是扩展原生的UI 一个是扩展原生的java方法,这里我们只扩展原生的java方法非UI的功能。例如厂商的sdk。我们不需要UI 只需要uniapp集成远程插件,讨论可以加我微信ldpcode,我也承接各种软件项目。

接下来的步骤首先你要对android项目要有所了解,我是没有android原生开发经验的基础上,探索写得这个教程,有问题随时指出。

1:创建Android Studio的Module模块(这里是在官方给的demo里面创建 UniPlugin-Hello-AS 也就是这个项目里面 )

  • 1 在现有Android项目中创建library的Module。例如uniplugin_ufh_module

 

 

 

 

 

 

 

 

 

  • 2 配置刚创建的Module的build.gradle信息

 

 

 

 这是我的原来的build.gradle文件内容

plugins {
    id 'com.android.library'
}

android {
    compileSdkVersion 32

    defaultConfig {
        minSdkVersion 30
        targetSdkVersion 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
View Code

我们需要添加以下代码:

uniapp-v8-release.aar是扩展module主要依赖库,必须导入此依赖库!

//导入aar需要的配置
repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    //必须添加的依赖
    compileOnly 'androidx.recyclerview:recyclerview:1.0.0'
    compileOnly 'androidx.legacy:legacy-support-v4:1.0.0'
    compileOnly 'androidx.appcompat:appcompat:1.0.0'
    compileOnly 'com.alibaba:fastjson:1.1.46.android'

    compileOnly fileTree(include: ['uniapp-v8-release.aar'], dir: '../app/libs')
}

 

新建一个module类

 例如我创建一个UHFmodule.java  

  • Module 扩展必须继承 UniModule 类 (这是uniapp自己封装的类)

 

 

 

我们开始写扩展方法:

官方提示:

  • 扩展方法必须加上@UniJSMethod (uiThread = false or true) 注解。UniApp 会根据注解来判断当前方法是否要运行在 UI 线程,和当前方法是否是扩展方法。
  • UniApp是根据反射来进行调用 Module 扩展方法,所以Module中的扩展方法必须是 public 类型。

 

//run ui thread
@UniJSMethod(uiThread = true)
public void testAsyncFunc(JSONObject options, UniJSCallback callback) {
    Log.e(TAG, "testAsyncFunc--"+options);
    if(callback != null) {
        JSONObject data = new JSONObject();
        data.put("code", "success");
        callback.invoke(data);
    }
}

//run JS thread
@UniJSMethod (uiThread = false)
public JSONObject testSyncFunc(){
    JSONObject data = new JSONObject();
    data.put("code", "success");
    return data;
}

 

  • 同样因为是通过反射调用,Module 不能被混淆。请在混淆文件中添加代码:
  • -keep public class * extends io.dcloud.feature.uniapp.common.UniModule{*;}


  • Module 扩展的方法可以使用 int, double, float, String, Map, List ,com.alibaba.fastjson.JSONObject 类型的参数

 

 

 

插件调试

#本地注册插件

  • 在UniPlugin-Hello-AS工程下 “app” Module根目录assets/dcloud_uniplugins.json文件。 在moudles节点下 添加你要注册的Module 或 Component

 

dcloud_uniplugins.json说明

  • nativePlugins: 插件跟节点 可存放多个插件
  • hooksClass: 生命周期代理(实现AppHookProxy接口类)格式(完整包名加类名)
  • plugins: 插件数组
  • name : 注册名称
  • class : module 或 component 实体类完整名称
  • type : module 或 component类型。
{
    "nativePlugins": [
        {
            "hooksClass": "uni.dcloud.io.uniplugin_richalert.apphooks",
            "plugins": [
            {
                "type": "module",
                "name": "DCloud-RichAlert",
                "class": "uni.dcloud.io.uniplugin_richalert.RichAlertModule"
            }
            ]
        }
    ]
}

 

 

 

uni-app项目中获取插件

通过使用uni.requireNativePlugin获取插件对象。

const pluginImpl = uni.requireNativePlugin('插件 name')

 

 

#集成uni-app项目测试插件

 

posted @ 2023-01-13 21:46  ldp.im  阅读(11358)  评论(1编辑  收藏  举报