AndroidJniDemo1
安卓對c進行so文件打包,并以jni的形式進行調用
項目中的部分
app : 編譯so文件
jniDemo: 添加運行so文件
開發環境:
android studio 3.0.1
(As3.0以上創建項目,選擇支持c/c++,項目會自動生成需要的配置,不需要在編寫cMakeList文件,創建后,直接運行,即可調用cpp里面c文件的內容)
配置ndk
谷歌官方下載 https://developer.android.google.cn/ndk/downloads/
android studio的sdk manager里下載
(直接在file——project structure——sdk——ndk 點擊download,有可能存在文件缺失,建議官方下載,在ndk里面配置)
打包so
把Native方法提取出來,在一個類里面專門處理,如jniUtil.java
運行app,點擊工具欄 build-make"app",在app/build/intermediates/cmake/debug下可以看到生成的so文件,把他們拷貝出來,給JniDemo使用。
注意:
jniUtil里面的包名要和cpp里面c文件的方法名的包名一致,一般我們現在jniUtil里面寫好方法后,點擊alt+enter生成c方法,這樣不易出錯
調用jni
在jniDemo里面新建文件夾jnilibs,把so文件的幾個文件放在里面,在gradle配置
配置gradle
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDir "src/main/jniLibs"
}
創建方法類(包名類名要和so里面的一致)
在java中創建與上面jniUtil.java相同的包,并把jniUtil.java拷到次目錄。
##備注
3.配置動態連接庫的名稱,在mode的gradle->defaultConfig下增加以下代碼
ndk {
moduleName "JNITest" //輸出的SO文件名稱
abiFilters "armeabi", "armeabi-v7a", "x86"//指定cpu的類型
}
4.加載動態連接庫,在編寫native方法類中新增:
static
{
System.loadLibrary("native-lib");//名字注意,需要跟你的build.gradle ndk節點下面的名字一樣
}
gradle設置so庫名
defaultConfig {
applicationId "com.ndk.****"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
ndk {
moduleName "LJPriject" //輸出的SO文件名稱
abiFilters "armeabi-v7a","x86"//指定cpu的類型
}
}
so庫名Library
System.loadLibrary導入,如果build.gradle ndk沒有配置,那么要和CMakeLists里面一樣,Sets the name of the library后面的名字,否則出現導入庫失敗,查找不到該庫