最近遇到的一个项目中,使用了一个so库,这个so库中会去调用另一个so,但是在运行时会提示
dlopen failed: library "libc++.so" not found: needed by /data/app/~~D00W8e9ltq0qAmTYszJlCw==/com.xxx.xxx-Fnp4Vw9VDWGnn3Wj-gBGVQ==/base.apk!/lib/riscv64/libxxx.so in namespace classloader-namespace
这个libxxx.so是我自己的so依赖的第三方的一个so,我使用的是CMake来生成构建文件,网上查资料大部分都是"libc++_shared.so" not found,他们的方法大部分我都尝试过,包括externalNativeBuild中添加arguments “-DANDROID_STL=c++_shared”,或者把 libc++.so 复制到 libxxx.so 同级目录,但这些都是因为这些so文件本身缺少libc++.so,但我的情况是依赖的另一个so缺少该文件,也不能重新生成libxxx.so,缺少对应的c文件。
#导入第三方so包,并声明为 IMPORTED 属性,指明只是想把 so 导入到项目中
add_library(NEEDED_LIBRARY SHARED IMPORTED)
add_library(C++ SHARED IMPORTED)
#指明 so 库的路径,CMAKE_SOURCE_DIR 表示 CMakeLists.txt 的路径
set_target_properties(
NEEDED_LIBRARY
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/../lib/${ANDROID_ABI}/libxxx.so)
set_target_properties(
C++
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/../lib/${ANDROID_ABI}/libc++.so)
target_link_libraries(
your_target_library,
# Links the target library to the C++ library
C++
NEEDED_LIBRARY
)