Android NDK:dlopen失败了

时间:2017-11-14 07:18:49

标签: android android-ndk

我有一个奇怪的错误:

java.lang.UnsatisfiedLinkError: dlopen failed: cannot find "./obj/local/armeabi-v7a/libsharedlibrary.so" from verneed[1] in DT_NEEDED list for "/data/data/com.my.app/cache/libnative.so"

我已经尝试了很多,但我不明白。我希望那里的任何人都可以帮助我!提前谢谢!

编辑: 这不是this问题的重复,因为它不是同一个错误。这个问题的答案对我没有帮助......

1 个答案:

答案 0 :(得分:3)

libsharedlibrary.so缺少其SONAME条目。您当前可能会看到以下内容:

$ readelf -dW libnative.so | grep NEEDED | grep libsharedlibrary
 0x0000000000000001 (NEEDED)             Shared library: [./obj/local/armeabi-v7a/libsharedlibrary.so]

请注意,如果您的系统上没有readelf,它将在NDK中提供为$ NDK / toolchains / arm-linux-androideabi-4.9 / prebuilt / linux-x86_64 / bin / arm-linux-androideabi-readelf (根据操作系统的需要调整路径)。请注意,这里的架构实际上并不重要。 readelf是一个多拱工具。任何工具链的readelf都能正常工作。

如果使用SONAME构建libsharedlibrary.so,您应该看到的是:

$ readelf -dW libnative.so | grep NEEDED | grep libsharedlibrary
 0x0000000000000001 (NEEDED)             Shared library: [libsharedlibrary.so]

您应该在libsharedlibrary.so上看到以下内容:

$ readelf -dW libsharedlibrary.so | grep SONAME
 0x000000000000000e (SONAME)             Library soname: [libsharedlibrary.so]

问题是libsharedlibrary.so没有使用-Wl,-soname,libsharedlibrary.so ldflag构建。 ndk-build和CMake会为你做这件事,但如果你使用独立的工具链或自定义构建系统,那么你需要自己提供。