我想使用来自另一个安卓项目的现有本地库,所以我只是将构建的库(libcalculate.so)复制到我的新安卓项目中。在我的新安卓项目中,我创建了一个文件夹libcalculate.so并将libs/armeabi/
放在那里。没有 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)
====UPDATE=====
我还尝试在项目根目录下创建一个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"
发布于 2014-12-17 18:26:28
要从根本上解决问题(也许还能同时解决你的问题),你可以这样做:
<project>/libs/(armeabi|armeabi-v7a|x86|...)
中复制你的libcalculate.so
文件。当使用Android Studio时,它是<project>/app/src/main/jniLibs/(armeabi|armeabi-v7a|x86|...)
,但我看到您使用的是eclipse。libcalculate.so
并将其作为压缩文件打开,以检查您的APK文件是否在eclipse中,并安装您的application来分析libcalculate.so
为了检查步骤5-7,您可以使用我的应用程序,而不是命令行,并读取step:Native Libs Monitor
PS:在默认情况下,.so文件应该放在哪里或在哪里生成很容易让人感到困惑,下面是总结:
在小于5.0版本的设备上,在应用程序的nativeLibraryPath中,在应用程序的legacyNativeLibraryDir/CPU_ARCH中,在Android Studio project
其中CPU_ABI是以下任意一种: armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。这取决于你的目标架构和你的库已经编译好了。
还请注意,库不会在CPU_ABI目录之间混合:您需要使用的所有库,如果armeabi-v7a文件夹中有来自APK的库,则不会在armeabi-v7a设备上安装armeabi -v7a文件夹中的库。
发布于 2015-03-24 23:49:04
在gradle中,将所有文件、文件夹复制到libs/
后
jniLibs.srcDirs = ['libs']
将上述代码行添加到build.gradle
文件中的sourceSets
中即可。其他任何东西都不起作用。
发布于 2015-10-27 21:06:59
在我的例子中,我必须排除使用gradle编译源代码,并设置libs路径
android {
...
sourceSets {
...
main.jni.srcDirs = []
main.jniLibs.srcDirs = ['libs']
}
....
https://stackoverflow.com/questions/27421134
复制相似问题