??前段時間開發過程中用到了簡單的JNI使用,當時發現很多網上文章總有這樣那樣的問題,最近趁時間充裕就記錄下來,以供記憶和交流。
JNI環境配置
這里就不做多講,百度一下,把腳跨過墻就好。
寫一個簡單的SO庫
先在項目中創建一個類,里面暴露出本地代碼的接口。
隨后使用Terminal 執行生成.h的命令,將目錄先定位到java目錄,再執行
javah -jni com.monke.simplejnidemo.SimpleJniUtils
隨后系統會自動生成 .h 文件
在main目錄創建jni文件夾,并將剛剛生成的 .h 文件移入,新建一個 .c 文件,并引入 .h,
實現JNIEXPORT jint JNICALL Java_com_monke_simplejnidemo_SimpleJniUtils_doubleData
方法
在build.gradle中添加
android{ ...
sourceSets{
main{
jni.srcDirs=[] //不使用gradle編譯本地c/c++代碼
jniLibs.srcDirs = ['libs','src/main/libs']//加載so庫 lib是第三方so src/main/libs是準備生成的so庫位置
}
}
}
在gradle.properties文件中,沒有就新建一個,添加android.useDeprecatedNdk=true
在jni目錄中添加Android.mk
,Application.mk
文件
Android.mk中寫
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := SimpleJni
LOCAL_SRC_FILES =: simplejniutils.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE
打包出來lib的名稱,引用so庫的時候需要使用
LOCAL_SRC_FILES
是代碼原文件,路徑是jni目錄開始,多文件使用 \ 分割
Application.mk中寫
APP_ABI := all
APP_ABI 是各個平臺的分包,all是所有。
最后使用Terminal將目錄定位到main,執行ndk-build
最后在SimpleJniUtils類中添加
static{
System.loadLibrary("SimpleJni");
}
測試一下,找個地方調用,run~
一切順利,隨后我們可以將so庫,SimpleJniUtils類文件以及SimpleJniUtils所在的包路徑給需要的人。
在項目中使用so庫
在項目中放入so庫文件,同時將SimpleJniUtils放入項目中,SimpleJniUtils的路徑必須與so打包時的路徑一致。
build.gradle 中添加
sourceSets{
main{
jniLibs.srcDirs = ['libs']
}
}
在gradle.properties文件中,沒有就新建一個,添加android.useDeprecatedNdk=true
,最后在需要的地方調用