既然用到了JNI,那不妨可以再踏深一步,如果有个需求是要求你去装饰一个SO
库,或者是封装几个SO
库。那这篇文章一定要看。
跟上一章一样,在build.gradle
添加
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
在main
目录下新建jni
文件夹,再在jni
文件夹新建simplejinlib
文件夹(名称随意)将要被调用的so
库放入,并将此SO
库的 .h
文件放入simplejinlib
文件夹中,如若没有则用命令生成一个,再新建Android.mk
文件,目录结构如下图
Android.mk
中写入
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)
随后跟第一章过程一样写native
接口,用命令生成.h
文件,将.h
文件移入jni
文件,并新建一个c
文件,Android.mk
,Application.mk
文件,文件结构如下
monke_jnidemo_Utils.h
文件中引用部分添加 #include "simplejinlib/com_monke_simplejnidemo_SimpleJniUtils.h"
externdemojin.c
文件中实现方法
#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
引用的库名,如果有多个用 \ 分割,最后使用Terminal 将目录定位到main
,ndk-build
打包出so
库,这里注意打包出来的so
会包含多个,自身的以及引用的
最后将
static{
System.loadLibrary("ExternJni");
}
填写进接口类中
测试下