源码部分
项目需要调用第三方so函数,由于需要调用的函数不符合jni规范,这里用jni调用编写的native方法,native方法再调用三方so函数。
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libxxx
LOCAL_SRC_FILES := libxxx.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libyyy
LOCAL_SRC_FILES := libyyy.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloJni
LOCAL_SRC_FILES =: HelloJni.cpp
LOCAL_SHARED_LIBRARIES := \
libxxx \
libyyy
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_MODULES := HelloJni
APP_PLATFORM := android-16 #对应平台版本 主要指定了ndk目录下对应platform资源
APP_ABI := armeabi-v7a #编译目标ABI =all 表示全部 #由于使用了三方so,需要对应三方so的类型#
安卓load部分
static {
System.loadLibrary("xxx");
System.loadLibrary("yyy");
System.loadLibrary("HelloJni");
}
编译相关
ndk配置:
在File->Project Structure中可以快速配置,没有资源可以直接Download
使用External Tools:
打开File->Settings->Tools->External Tools
点击 + 新建:
Program: /你的ndk路径/ndk-build.cmd
Working directory: $ModuleFileDir$\src\main
添加完成后,点击右键选择External tools->ndk-build 即可进行编译。(源码文档齐全)
编译成功后,将生成的 libxxx.so libyyy.so libHelloJni.so 放入src/main/jniLibs目录即可使用。
或者也可以使用将jniLibs修改为src/libs
sourceSets.main {
jniLibs.srcDir "libs"
}
兼容性问题
在不同终端上使用时发现会有兼容性问题。
三方库使用系统库函数,而不同终端平台系统库有差异,导致有时候会报错。
Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "__strncpy_chk2" referenced by "libxxx.so"
这个问题困扰了很久,在网上查找资料多说是ndk版本问题,一再尝试都失败。
最后定位了__strncpy_chk2应该在libc.so中,导出了终端上对应的libc.so文件,使用nm命令查看发现果然没有这个symbol 。(有点鸡肋的问题,希望对遇到相同问题的人有帮助)
参考:https://blog.csdn.net/findsafety/article/details/72821732
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)