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.mkApplication.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,最后在需要的地方調用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容