已有工程使用已存在的so庫
注意 :不管動態(tài)注冊還是靜態(tài)注冊,jni里面的函數(shù)和java 類名包名都是一一對應(yīng)關(guān)系,兩個不同包名的工程或者兩個類無法使用同一個jni庫。同一個工程下面多個類都調(diào)用jni庫,可以采取輔助類或者輔助jar包的方式
添加so庫到項目
第一種方式 :將庫放置libs下面
由于Android Studio中,則會默認(rèn)匹配main下的jniLibs目錄,故如果將庫放在libs下面 需要在build.gradlel里面添加如下配置
android {
......
sourceSets {
main {
jniLibs.srcDirs = ['libs']
......
}
......
}
......
}
此時將so庫放到libs下面,在sync以下,AS就會自動生成jniLibs文件夾,并且有了放在libs下面的so庫
第二種方式:手動創(chuàng)建jniLibs 文件夾,將庫手動放置jniLibs 下面
在指定位置新建jniLibs文件夾,注意大小寫
將so庫復(fù)制到j(luò)niLibs 文件夾下編譯即可
如果要精簡通過so庫來減少安裝包的大小其實還可以通過動態(tài)選擇需要添加的.so庫
在App下的build.gradle中配置:
ndk {
//選擇要添加的對應(yīng)cpu類型的.so庫。
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
// 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
注意: libs 和 jniLibs是沖突的,so庫只能放在一處, 如果放在libs下面,并且指定 jniLibs.srcDirs = ['libs'], 那么手動放在jniLibs下面的庫將不會加載,所以兩邊都有時 需要合并
java代碼調(diào)用so庫
- 調(diào)用方法前 加載so庫
- 聲明native方法
- 調(diào)用native方法
已有工程NDK開發(fā)
方式一 新建module方式
優(yōu)點:輸出aar包,多個工程可以共用jni,不用jni注冊函數(shù)和調(diào)用函數(shù)包名類名一致,相當(dāng)于新建了輔助aar用于jni調(diào)用
新建->module->Android Native Library
選擇完后AS工程會多出一個module
build nativelib 在對應(yīng)build文件夾下面會生成aar包
方式二 主項目中NDK開發(fā)
使用傳統(tǒng)jni目錄開發(fā)
-
File->new->Folder->JNI Folder
切換到project模式會看到j(luò)ni文件夾,在jni文件夾下新建cpp、Android.mk
image.png
使用cmake開發(fā)
-
File->Add C++ to module
捕獲.PNG
選擇創(chuàng)建CmakeLists這個選項后AS自動生成cpp目錄如下
捕獲.PNG
新工程NDK開發(fā)
新建 工程 選擇 native C++
選擇完后 AS會自動生成CPP文件夾,里面包含 CMakeList 和 cpp 文件
AndroidStudio更新到2.2,有了CMake和傳統(tǒng)JNI兩種開發(fā)NDK的方法,新建native工程只能得到cmake方式,要想jni開發(fā)方式,只能普通項目轉(zhuǎn)jni,具體參考:https://blog.csdn.net/chenhuakang/article/details/77364926