gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:10:15 29 4
gpt4 key购买 nike

我想使用来自另一个 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"

最佳答案

为了根本原因(也许同时解决您的问题),您可以这样做:

  1. 删除 jni 文件夹和所有 .mk 文件。如果您不编译任何内容,则不需要这些,也不需要 NDK。

  2. 复制您的libcalculate.so <project>/libs/(armeabi|armeabi-v7a|x86|...) 内的文件.使用 Android Studio 时为 <project>/app/src/main/jniLibs/(armeabi|armeabi-v7a|x86|...) ,但我看到你正在使用 eclipse。

  3. 构建您的 APK 并将其打开为 zip 文件,以检查您的 libcalculate.so文件在 lib/(armeabi|armeabi-v7a|x86|...) 中。

  4. 删除并安装您的应用程序

  5. 运行 dumpsys 软件包 | grep yourpackagename 以获取您的应用程序的 nativeLibraryPathlegacyNativeLibraryDir

  6. 在您拥有的 nativeLibraryPathlegacyNativeLibraryDir/armeabi 上运行 ls,以检查您的 libcalculate.so 是否确实存在.

  7. 如果存在,请检查它是否没有从您的原始 libcalculate.so 文件中更改:它是否针对正确的架构编译,是否包含预期的符号,是否存在任何缺少的依赖项。您可以使用 readelf 分析 libcalculate.so。

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

PS:很容易混淆 .so 文件应该放在哪里或默认生成,这里是一个总结:

  • libs/CPU_ABI 在 Eclipse 项目中

  • jniLibs/CPU_ABI 在 Android Studio 项目中

  • jni/CPU_ABI 在 AAR 中

  • lib/CPU_ABI 在最终 APK 中

  • 在 <5.0 设备上的应用 nativeLibraryPath 内,以及在 >=5.0 设备上应用的 legacyNativeLibraryDir/CPU_ARCH 内。

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

还请注意,库不会在 CPU_ABI 目录之间混合:您需要使用的全套库,armeabi 文件夹中的库不会安装在 armeabi-v7a 设备,如果在 APK 的 armeabi-v7a 文件夹中有任何库。

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com