??既然用到了JNI,那不妨可以再踏深一步,如果有個(gè)需求是要求你去裝飾一個(gè)SO庫(kù),或者是封裝幾個(gè)SO庫(kù)。那這篇文章一定要看。
跟上一章一樣,在build.gradle添加
sourceSets{
main{
jni.srcDirs=[] //不使用gradle編譯本地c/c++代碼
jniLibs.srcDirs = ['libs','src/main/libs'] //加載so庫(kù) lib是第三方so src/main/libs 是準(zhǔn)備生成的so庫(kù)位置
}
}
在gradle.properties添加android.useDeprecatedNdk=true
在main目錄下新建jni文件夾,再在jni文件夾新建simplejinlib文件夾(名稱隨意)將要被調(diào)用的so庫(kù)放入,并將此SO庫(kù)的 .h 文件放入simplejinlib文件夾中,如若沒(méi)有則用命令生成一個(gè),再新建Android.mk文件,目錄結(jié)構(gòu)如下圖
Android.mk中寫(xiě)入
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := SimpleJni
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libSimpleJni.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(PREBUILT_SHARED_LIBRARY)
隨后跟第一章過(guò)程一樣寫(xiě)native接口,用命令生成.h文件,將.h文件移入jni文件,并新建一個(gè)c文件,Android.mk,Application.mk文件,文件結(jié)構(gòu)如下
monke_jnidemo_Utils.h文件中引用部分添加
#include "simplejinlib/com_monke_simplejnidemo_SimpleJniUtils.h"
externdemojin.c文件中實(shí)現(xiàn)方法
#include <monke_jnidemo_Utils.h>
JNIEXPORT jint JNICALL Java_monke_jnidemo_Utils_checkDoubleData
(JNIEnv *env, jclass j, jint a){
return Java_com_monke_simplejnidemo_SimpleJniUtils_doubleData(env,j,a);
這里注意,jni文件下的Android.mk填
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES :=SimpleJni
LOCAL_MODULE := ExternJni
LOCAL_SRC_FILES := externdemojin.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
include $(LOCAL_PATH)/simplejinlib/Android.mk
LOCAL_SHARED_LIBRARIES引用的庫(kù)名,如果有多個(gè)用 \ 分割,最后使用Terminal 將目錄定位到main,ndk-build打包出so庫(kù),這里注意打包出來(lái)的so會(huì)包含多個(gè),自身的以及引用的
最后將
static{
System.loadLibrary("ExternJni");
}
填寫(xiě)進(jìn)接口類中
測(cè)試下