JNI開發(一) 簡單的C程式碼打包成SO庫以及專案如何呼叫SO庫
前段時間開發過程中用到了簡單的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
,最後在需要的地方呼叫