android - System.loadLibrary(...) 在我的情况下找不到 native 库

标签 android android-ndk

我想使用 中的现有 native 库另一个 Android 项目,所以我只是将 NDK 构建的库 ( libcalculate.so ) 复制到我的新 Android 项目中。在我的新 Android 项目中,我创建了一个文件夹 libs/armeabi/并把 libcalculate.so 那里。有没有 jni/文件夹。我的测试设备具有 ARM 架构。

在我的 java 代码中,我通过以下方式加载库:

  static{
    System.loadLibrary("calculate");
  }

当我运行我的新 android 项目时,出现错误:
java.lang.UnsatisfiedLinkError:  ...
nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libcalculate.so"

因此,正如错误所说,复制的 native 库不在/verdor/lib 或/system/lib 中,在我的情况下如何解决这个问题?

(我解压了apk包,在lib/下有libcalculate.so)

====更新=====

我还尝试在项目根目录下创建一个 jni/文件夹,并在 jni/下添加一个 Android.mk 文件。 Android.mk 的内容是:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := libcalculate
LOCAL_SRC_FILES := libcalculate.so
include $(PREBUILT_SHARED_LIBRARY)

然后,在项目根目录下,我执行了 ndk-build 。之后,由 ndk-build 生成 armeabi/和 armeabi-v7a/目录(文件夹内有 libcalculate.so)。

然后我成功运行我的 maven 构建项目。在最终的 apk 包中,有:
lib/armeabi/libcalculate.so
lib/armeabi-v7a/libcalculate.so

但是当我运行我的应用程序时,同样的错误抛出:
java.lang.UnsatisfiedLinkError:  ...
nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libcalculate.so"

最佳答案

为了根本原因(也许同时解决您的问题),您可以执行以下操作:

  • 删除 jni 文件夹和所有 .mk 文件。如果你不编译任何东西,你就不需要这些也不需要 NDK。
  • 复制您的 libcalculate.so <project>/libs/(armeabi|armeabi-v7a|x86|...) 内的文件.使用 Android Studio 时为 <project>/app/src/main/jniLibs/(armeabi|armeabi-v7a|x86|...) ,但我看到你正在使用 Eclipse。
  • 构建您的 APK 并将其作为 zip 文件打开,以检查您的 libcalculate.so文件在 内lib/(armeabi|armeabi-v7a|x86|...) .
  • 删除并安装您的应用程序
  • 运行 dumpsys 软件包 | grep yourpackagename 以获取应用程序的 nativeLibraryPath 或 legacyNativeLibraryDir。
  • 在您拥有的 nativeLibraryPath 或 legacyNativeLibraryDir/armeabi 上运行 ls,以检查您的 libcalculate.so 是否确实存在。
  • 如果它在那里,请检查它是否没有从您的原始 libcalculate.so 文件中更改:它是否针对正确的体系结构编译,是否包含预期的符号,是否缺少任何依赖项。您可以使用 readelf 分析 libcalculate.so。

  • 为了检查步骤 5-7,您可以使用我的应用程序而不是命令行和 readelf:Native Libs Monitor

    PS:很容易混淆 .so 文件应该放在哪里或默认生成,这里是一个摘要:
  • 库/CPU_ABI 在 Eclipse 项目中
  • jniLibs/CPU_ABI 在 Android Studio 项目中
  • jni/CPU_ABI AAR 内
  • 库/CPU_ABI 在最终的 APK
  • 在应用程序的 native 库路径 在 <5.0 的设备上,在应用程序的 内legacyNativeLibraryDir/CPU_ARCH 在 >=5.0 的设备上。

  • 在哪里 CPU_ABI 是以下任何一个:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。取决于您所针对的架构以及您的库已针对哪些架构进行编译。

    另请注意,库不会在 CPU_ABI 目录之间混合:您需要使用的全部内容,如果 armeabi 内有任何库,则不会在 armeabi-v7a 设备上安装 armeabi 文件夹内的库-v7a 来自 APK 的文件夹。

    关于android - System.loadLibrary(...) 在我的情况下找不到 native 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38795438/

    相关文章:

    Android SDL2 在锁定屏幕上恢复

    Android+android-ndk-r10d+OpenCV-2.4.10 编译报错

    android - 如何去除 NavigationView 下方的阴影?

    java.lang.String 无法从 Android 转换为 JSONObject

    android - Web 服务 (ASP.NET) 和 android 应用程序 (API) 可通话性

    android - 将项目添加到 C++ native 中的 ArrayList 会使单击监听器上的 android 应用程序崩溃

    android - 启用 armv6 FFmpeg 在 Android NDK 下崩溃

    android - 从 PC 向 Android 手机发送命令 - 通过物理连接(USB、串口等)

    java - 尝试设置 AlertDialog 但不断出现错误

    android - 使用cmake集成FFMPEG : dlopen failed: library "libavutil.so.56" not found