大步驟:
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 類型的參數