java.lang.UnsatisfiedLinkError:dlopen失败:未找到库“libc ++。so”

时间:2016-09-07 12:56:21

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

我试图在我的Android应用程序中使用两个预先构建的本机库(.so)。为此我创建了一个JNI项目,我已经完成了以下工作,

  1. 创建了一个java本机库,并使用javac
  2. 进行编译
  3. 使用javah -jni命令
  4. 创建了一个C头
  5. 创建了实现方法的相应C源文件
  6. 此C源代码(其中的方法)将引用.so文件公开的方法
  7. Android.mk文件已写入。它在下面给出。
  8. 使用ndk-build构建它然后推送到移动设备
  9. 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
    

    如果我没有加载module1,module2库应用程序将正常工作(我注释掉了对这两个模块公开的方法的调用,并重写了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中运行。

1 个答案:

答案 0 :(得分:1)

什么是libmodule1.so?这听起来像是一个库,你从一个Android设备,并试图使用。这几乎只适用于您从中提取的确切设备。

至于第二部分,听起来x86_64目录中的库实际上不是x86_64库。试试Machine: Advanced Micro Devices X86-64 。它将打印库的ELF头。其中一行应该是:

<img id="give_me_src"/>

如果machine的值是其他任何东西,那么它不是x86_64库。