【问题标题】:java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++.so" not foundjava.lang.UnsatisfiedLinkError:dlopen 失败:找不到库“libc++.so”
【发布时间】:2016-09-08 15:30:31
【问题描述】:

我正在尝试在我的 Android 应用程序中使用两个预构建的本机库 (.so)。为此,我创建了一个 JNI 项目,并在其中完成了以下操作,

  1. 创建了一个java原生库并用javac编译
  2. 使用 javah -jni 命令创建了 C 头文件
  3. 创建了相应的 C 源文件,其中实现了方法
  4. 此 C 源代码(其中的方法)将引用 .so 文件公开的方法
  5. Android.mk 文件已写入。如下所示。
  6. 使用 ndk-build 进行构建,然后推送到移动端

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := libmodule1
LOCAL_SRC_FILES := prebuilts/$(TARGET_ARCH_ABI)/libmodule1.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE    := libmodule2
LOCAL_SRC_FILES := prebuilts/$(TARGET_ARCH_ABI)/libmodule2.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE    := com_example_androidwrapper_NativeLibrary
LOCAL_SRC_FILES := com_example_androidwrapper_NativeLibrary.c
LOCAL_SHARED_LIBRARIES := libmodule1 libmodule2 
include $(BUILD_SHARED_LIBRARY)

当我运行这个应用程序时,我收到以下错误。

java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++.so" not found

如果我不加载模块 1,模块 2 库应用程序将正常工作(我注释掉了对这两个模块公开的方法的调用,并将 Android.mk 文件重写为仅构建共享库而不使用任何预构建那些)这工作正常。

感谢任何帮助。谢谢。

我已经成功地使用了我在同一目标设备中运行的本机应用程序中的预构建 .so 文件。 当我更改 application.mk “APP_ABI := all” 它给了我以下错误。

[x86_64] Prebuilt       : module1.so <= jni/
[x86_64] Install        : module1.so => libs/x86_64/module1.so
C:/Users/user/AppData/Local/Android/android-ndk-r12b/build//../toolchains/x86_64-4.9/prebuilt/windows/bin/x86_64-linux-android-strip: Un
able to recognise the format of the input file `./libs/x86_64/module1.so'
make: *** [libs/x86_64/module1.so] Error 1
make: *** Deleting file `libs/x86_64/module1.so'

我认为预构建的 .so 文件应该在 arm64-v8a 本身中运行。

【问题讨论】:

  • 请出示您的Application.mk
  • APP_STL=c++_shared 添加到Application.mk 可能会有所帮助。
  • @Serhio My Application.mk 仅指定了目标。 APP_ABI := arm64-v8a
  • @michalsrb 我试过了。仍然面临同样的问题
  • 我猜你的设备根本不是arm64-v8a。将APP_ABI 设置为all 并按照@michalsrb 的建议添加APP_STL

标签: java android c++ android-ndk java-native-interface


【解决方案1】:

什么是 libmodule1.so?听起来它是您从 android 设备上取下并尝试使用的库。这几乎只适用于您从中提取它的确切设备。

至于第二部分,听起来您的 x86_64 目录中的库实际上并不是 x86_64 库。试试$NDK/toolchains/x86_64-4.9/prebuilt/$YOUR_OS/bin/x86_64-linux-android-readelf -h module1.so。它将打印库的 ELF 标头。其中一行应该是:

Machine:                           Advanced Micro Devices X86-64

如果 machine 的值是别的,它不是 x86_64 库。

【讨论】:

  • 你是对的。 libmodule1.so 是专门为这个目标构建的。这就是为什么我的 Application.mk 文件具有特定目标的原因。
  • 我知道它不适用于 x86_64,因为它不是为此而构建的。但这是为 Serhio 提供的更新。
  • 哦。我相当肯定评论是错误的。如果您只想针对 arm64,请将 APP_ABI 设置回 arm64-v8a。我也会删除您问题的那一部分,因为它会影响您的实际问题。 “你说得对。libmodule1.so 是专门为这个目标构建的。”这是否意味着你adb pull'd 了它?您是否将您的应用程序推回完全同一设备?该设备是否运行 Android N?
  • 好吧,我使用另一个编译器 (AOSP) 和“mm”实用程序构建了这个 .so 文件。我将应用程序推回同一设备,是的,它是 android N
  • 除非您针对 NDK 构建该库,否则您不能这样做:developer.android.com/about/versions/nougat/…
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 2017-04-11
  • 2019-07-31
  • 2020-07-28
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多