1. 程式人生 > >JNI開發(一) 簡單的C程式碼打包成SO庫以及專案如何呼叫SO庫

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,最後在需要的地方呼叫
這裡寫圖片描述