我想使用 中的现有 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"
最佳答案
为了根本原因(也许同时解决您的问题),您可以执行以下操作:
libcalculate.so
<project>/libs/(armeabi|armeabi-v7a|x86|...)
内的文件.使用 Android Studio 时为 <project>/app/src/main/jniLibs/(armeabi|armeabi-v7a|x86|...)
,但我看到你正在使用 Eclipse。 libcalculate.so
文件在 内lib/(armeabi|armeabi-v7a|x86|...) . 为了检查步骤 5-7,您可以使用我的应用程序而不是命令行和 readelf:Native Libs Monitor
PS:很容易混淆 .so 文件应该放在哪里或默认生成,这里是一个摘要:
在哪里 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/