在Android工程中调三方so

55 阅读1分钟

如果只有so文件和头文件

  1. 把so导入到项目对应的目录中

image.png

如图可以在main目录下建一个jniLibs目录,并把不同arch的so拷贝到对应目录下。

  1. 把要调用的方法包含的头文件拷贝到jni目录中

image.png 如图把luban_dlfcn.h拷贝到工程的jni目录中,头文件可以找so的开发要。

  1. 在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 这个不能少 否则找不到库

  1. 在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…

image.png

我们在发布三方库的时候最好也支持这种方式,这样引入so会更简单