【问题标题】:java.lang.UnsatisfiedLinkError: dlopen failed: library "/Users/..." not foundjava.lang.UnsatisfiedLinkError:dlopen 失败:找不到库“/Users/...”
【发布时间】:2019-07-31 16:44:11
【问题描述】:

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

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复制到libgperf.so所在的目录下:

同时将 python 头文件复制到包含目录中:

当我点击运行按钮时:

java.lang.UnsatisfiedLinkError: dlopen failed: library "/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib/arm64-v8a/libpython.so" not found
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1657)
        at com.example.hellolibs.MainActivity.<clinit>(MainActivity.java:36)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1174)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2747)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2931)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1620)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:173)
        at android.app.ActivityThread.main(ActivityThread.java:6698)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782)

路径存在于我的电脑中,但是为什么apk使用我的电脑路径,而不是android设备路径?

而我使用的是安卓设备文件资源管理器,lib在目录下:

那我怎样才能让 apk 使用正确的路径呢?

或者我错过了要添加的内容?

【问题讨论】:

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


【解决方案1】:

我遇到了完全相同的问题,我发现在构建 .so 文件时,python 库的库链接错误,而 gperf 库的链接正常。
Link error for python library
这两个库都是在 cmake 中使用完全相同的方法导入的,因此没有任何意义。
我的朋友告诉我这是忍者的一个错误,他们为我提供了一个“周转”的解决方案。您必须导入 python 库,就好像它是 Android-NDK 提供的库一样(如 Android 或 Log)。

该库应放在NDK库中,该库应位于&lt;NDK PATH&gt;/toolchains/llvm/prebuilt/&lt;OS_related_folder&gt;/sysroot/usr/lib/&lt;ABI targeted&gt;/&lt;minSdkVersion/

地点:
- NDK path 是您的 NDK 文件夹的位置。
- OS_related_folder 是 os_named 文件夹(在我的例子中是 windows-x86_64)。
- ABI 目标是您的库编译到的 ABI(arm-linux-androideabi、aarch64-linux-android 等)。
- minSdkVersion 是您项目的最低 SDK 版本号。
此信息来自文件夹 `\app.cxx\cmake\debug\\' 中的 CMakeCache.txt。使用 find_library 进行日志时,会显示库的路径

CMakeLists.txt更改为只提供库包含,并通过库名直接链接库(python2.7 for libpython2.7.so)

cmake_minimum_required(VERSION 3.4.1)

add_library( native-lib SHARED native-lib.cpp)

include_directories( ${CMAKE_CURRENT_LIST_DIR}/../../../libs/python/include/ )

find_library( log-lib log ) # Optional

target_link_libraries( native-lib python2.7 ${log-lib} )

由于 Python 库并非由 Android 原生提供,您需要通过更改 jnLibs 文件夹将其打包到 APK(请参阅 documentation

按照这些步骤应该可以解决问题 Resulting library link in .so file

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

【讨论】:

  • 我有同样的问题,无法通过这种方法解决。还有其他解决方案吗?会不会是.so文件本身引起的问题?
  • 我认为放置 .so 的位置不正确。我曾经把它放在“ndk-bundle/platforms/android-//usr/lib/”中,但是最近更新了android update,位置发生了变化。我不再通过 Android Studio 编译 libpython,所以我无法自己测试它。你能试试并报告结果吗?
  • 我创建了一个新的项目并重做整个过程。放置文件的位置是 \\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\lib\\ 如果您不确定库的放置位置,根据需要添加日志并检查 .cxx/cmake/debug/ 文件夹中的 CMakeCache.txt 将提供日志库的路径,这是您应该放置库的位置跨度>
  • 感谢 Paul 的完整解释。我会尝试报告结果。
【解决方案2】:

假设路径 /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"]
    }
}    

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

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 2017-04-11
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多