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' }
我们需要添加以下代码:
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项目测试插件