【发布时间】:2023-03-11 05:36:01
【问题描述】:
我想使用来自另一个 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"
所以,正如错误所说,复制的本机库不在 /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"
【问题讨论】:
-
你把库直接放在
libs/下?您可能需要为每个要支持的目标 ABI(armeabi、armeabi-v7a、x86、mips 等)创建一个子目录,并将适当的 .so 文件放在每个子目录中(即为 armeabi 构建的 .so 文件放在 @ 987654329@等)。 -
@Michael ,我只是错过了在我的帖子中,我实际上把它放在了 libs/armeabi/
-
检查 libcalculate.so 是否实际被打包过程拾取 - 尝试例如
unzip -l package.apk,或将 apk 重命名为 .zip 并使用某些应用程序打开它。如果不存在,则说明打包有问题(您的 IDE 是否注意到文件夹存在,是否需要刷新项目?)。 -
@mstorsjo,我解压了apk包,在lib/下有libcalculate.so
-
您不需要有 Android.mk 或任何与编译相关的文件。只需将 so 文件放在 jniLibs 的相应子目录中,如下所示:github.com/Ph1b/MaterialAudiobookPlayer/tree/master/audiobook/…
标签: android android-ndk