java.lang.UnsatisfiedLinkError:dlopen失败:找不到库“ / Users / ...”

时间:2019-03-10 01:47:50

标签: android android-ndk java-native-interface shared-libraries

我想在android-ndk hello-libs示例中添加另一个库。

TEXTBOX中,我添加:

CMakeLists.txt

这:

# this is from the hello-libs sample code
add_library(lib_gperf SHARED IMPORTED)
set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION
        ${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so)

########## I add this after the sample code:  ###########
add_library(lib_py SHARED IMPORTED)
set_target_properties(lib_py PROPERTIES IMPORTED_LOCATION
        ${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libpython.so)

并将target_link_libraries( hello-libs android lib_gperf #### this line ###### lib_py log) 复制到libpython.so所在的目录中:

还将python标头复制到包含目录中:

enter image description here

当我点击运行按钮时:

libgperf.so

该路径存在于我的计算机中,但是为什么apk使用我的计算机路径而不是android设备路径?

然后我使用Android设备文件浏览器,该lib位于目录中:

enter image description here

那我该如何使apk使用正确的路径?

还是我错过了要添加的内容?

2 个答案:

答案 0 :(得分:1)

我遇到了完全相同的问题,我发现在构建.so文件时,python库的库链接错误,而gperf库的链接还可以。

Link error for python library

这两个库都在cmake中以完全相同的方法导入,因此没有意义。

我的一个朋友告诉我这是忍者的一个bug,并提供了“周转”解决方案。您必须导入python库,就好像它是Android-NDK提供的库一样(如Android或Log)

删除为lib_py添加的代码,并将target_link_library更改为

target_link_libraries(
    hello-libs
    android
    lib_gperf
    python //The name of the library libpython.so
    log
)

您仍然需要提供标题

target_include_directories( pyjni PRIVATE ${python_DIR}/include )

刷新C文件并尝试进行编译。 首次尝试时,它将告诉您编译器无法在特定位置找到python库。转到该位置并添加您的图书馆

就我而言

  

链接C共享库[...]   D:/Android/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x /../../../../ aarch64-linux-android / bin \ ld:找不到-lpython

将libpython.so文件添加到指定位置,在我的情况下为D:/Android/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/然后重新编译。

在我的情况下,它应该可以工作,您可以看到该链接现在只是libpython.so(在这种情况下,删除了libgperf.so)

Resulting library link in .so file

请注意,就我而言,我仅针对arm64-v8a进行编译。我现在不知道它是否可以与多个ABI一起使用。

显然,这不是一个好的解决方案。希望我的回答会引起更多关注,并且有人会提供一个真正的解决方案来避免此类调整

答案 1 :(得分:0)

假设路径/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib是正确的,那么您可以像下面这样配置您的JNI库:

sourceSets {
    release {
        jniLibs.srcDirs += ["/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib"]
    }
    debug {
        jniLibs.srcDirs += ["/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib"]
    }
}    

如果它不是通往jni库的正确路径,请尝试更改/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib