如果只有so文件和头文件
- 把so导入到项目对应的目录中
如图可以在main目录下建一个jniLibs目录,并把不同arch的so拷贝到对应目录下。
- 把要调用的方法包含的头文件拷贝到jni目录中
如图把luban_dlfcn.h拷贝到工程的jni目录中,头文件可以找so的开发要。
- 在CMakelist.txt文件中配置link到该so
# 找到so文件
find_library(linker_luban linker PATHS "${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}" NO_CMAKE_FIND_ROOT_PATH)
# 导入头文件
include_directories(${CMAKE_SOURCE_DIR}/src/main/jni)
# link到so
target_link_libraries(
# Specifies the target library.
DemoTest
# 其他
${linker_luban} # 三方库要带${} 否则找不到
)
NO_CMAKE_FIND_ROOT_PATH 这个不能少 否则找不到库
- 在c++代码中引入头文件,并调用其中的方法
#include "luban_dlfcn.h"
bool getThreadId() {
int sdk_version = android_get_device_api_level();
if (sdk_version < __ANDROID_API_L__) {
LLOG_DEBUG(TAG_POWER_TEST, "can't dump stacktrace, the sdk level is %d", sdk_version);
return false;
}
void *handle =
luban::linker::DlFcn::dlopen("libart.so", RTLD_LAZY | RTLD_LOCAL);
}
如果三方的so在aar中并且支持了prefab 方式引入,则可以参考github.com/bytedance/a…
我们在发布三方库的时候最好也支持这种方式,这样引入so会更简单