【发布时间】:2016-09-08 15:30:31
【问题描述】:
我正在尝试在我的 Android 应用程序中使用两个预构建的本机库 (.so)。为此,我创建了一个 JNI 项目,并在其中完成了以下操作,
- 创建了一个java原生库并用javac编译
- 使用 javah -jni 命令创建了 C 头文件
- 创建了相应的 C 源文件,其中实现了方法
- 此 C 源代码(其中的方法)将引用 .so 文件公开的方法
- Android.mk 文件已写入。如下所示。
- 使用 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