您的Android JNI应用中出现上述错误?请继续阅读...
在前面,我会说我已经用我自己的方式解决了这个问题,但我觉得Android构建系统中的某些内容(可能与Eclipse有关)已经破了,我希望能帮助别人节省数小时的痛苦。也许其他人已经遇到过这个问题,可以评论一下对他们有用的东西。
有一段时间,我有一个Android项目,其中包含一些我使用NDK开发的JNI代码。然后,今天,我在java代码中改变了一些东西,然后poof,我再也无法加载我的JNI库了。它失败了,例如:
E / AndroidRuntime(999):java.lang.UnsatisfiedLinkError:无法加载mylibrary:findLibrary返回null
我用Google搜索并尝试了所有内容(重建,关闭并重新启动Eclipse等)
最终解决了我的问题?在尝试另一次运行之前,我从设备上物理卸载了我的应用程序。而已。在那之后,它奏效了。什么对你有用?
答案 0 :(得分:15)
如果你有一个LOCAL_MODULE“libXYZ”的原生项目,请务必将其加载为
System.loadLibrary("XYZ");
答案 1 :(得分:13)
如果您尝试在模拟器中运行应用程序,请确保在运行中指定了正确的体系结构 - >运行配置 - >目标(您可能需要使用Window添加所需的模拟器 - > Android虚拟设备管理器)。
在尝试在英特尔模拟器中执行应用程序时,我遇到了同样的问题,而应用程序正在使用为ARM预编译的库。
答案 2 :(得分:11)
我也有这个问题,但对于我的情况,我在另一个项目中使用我的库。而且我认为这不是eclipse或android-ndk的问题。
你可以查看这些可能导致UnsatisfiedLinkError
的提示,它对我来说没问题,祝你好运:)
/your project/libs/armeabi/
修改强>
UnsatisfiedLinkError
,因此无法成功链接。答案 3 :(得分:6)
在libs文件夹中,我创建了一个名为armeabi-v7a的新文件夹,并将.so文件从armeabi复制到新文件夹。它解决了错误。
答案 4 :(得分:6)
就我而言,在制作系统应用程序时,问题与权限有关。将“ .so ”文件放入/system/lib/
或/system/vendor/lib/
目录后,我将默认分配的权限600修改为755.它运行良好。
答案 5 :(得分:5)
我遇到了同样的问题,这些是我对项目的一些问题:
System.load("hello-test");
更改为System.loadLibrary("hello-test");
; JNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz)
:此处使用Java_<java_package_name>_<java-class-name>_<function-name>
; local.properties
,在我的情况下ndk.dir=<my-path-to-ndk-directory>
;和build.gradle
也包含在defaultConfig
中:ndk { moduleName "hello-test" }
。com.example.testndk
TestNDK
hello-test.c
AndroidProjects/TestNDK/app/src/main/jni
IDE:Android Studio 0.8.1。
答案 6 :(得分:4)
首先,检查eclipse中的libs文件夹中的jni文件或android studio中的jniLibs文件夹。当你签入任何svn时,交叉检查以检查.so文件。
我的场景是在使用Android studio构建时。
当你在android studio中构建时,你的库.so文件或(jni)文件应该在\ src \ main \ jniLibs \ armeabi ***。so文件夹中。
这些文件将在\ libs \ armeabi ***中。所以在eclipse中。
使用eclipse和android studio构建时,必须将build.gradle文件修改为
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
// Fixed Issue : "android studio java.lang.unsatisfiedlinkerror: couldn't load find library returned null"
// Cause : For android studio : The JNI files should be placed in the /src/main/jniLibs folder.
// Fix : Mapping the jniLibs 's source Directories with Lib's folder
jniLibs.srcDirs = ['libs']
}
这里我使用android studio和eclipse构建项目。
答案 7 :(得分:2)
刚遇到类似问题。
查看您的/data/data/your.package.name/lib目录
当我进入我的包目录时,它当前显示:
lib -> /mismatched_uid/settings_10037/fs_1000
可能我意外地切换了sharedUserId,因此无法再访问该库。
答案 8 :(得分:2)
以前的答案都没有解决我的问题,但是这样做了:问题一直是必要的子目录和文件不存在。我在libs文件夹中的所有内容都是一个armeabi文件夹,其中包含正确的.so文件,但是应该有3个其他文件夹,每个文件都包含一个.so文件。还不确定其他三个(armeabi-v7a,mips或x86)中哪一个是必需的,但我知道当我将Application.mk文件添加到与Android.mk相同的文件夹时,这三个都是自动生成的。文件,并确保其中包含以下行:
APP_ABI := all
对我来说,那条线是那里唯一的文字。然后运行ndk-build时,Application.mk文件显然会导致&#34; all&#34;要创建的4个文件夹以及要在其中创建的正确.so文件。一旦我将Application.mk安装到位,我再次运行ndk-build,然后在我再次尝试之前对Eclipse项目进行了清理和清除。一切都很顺利。
答案 9 :(得分:1)
无需root设备..在模拟器上部署应用程序并浏览文件夹
答案 10 :(得分:1)
我添加了
extern "C"
在函数声明之前
例如:
extern "C"
jstring
Java_lara_myapplication_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
然后错误消失了
答案 11 :(得分:1)
我刚刚发生这种情况,问题是设备根本没有足够的空间来安装库。我卸载了一些其他应用程序,然后就可以了。
答案 12 :(得分:1)
如果您的本机项目包含“libXYZ.so”,请确保您的设备上不存在/system/lib/libXYZ.so。有一个痛苦的解决方法:使用
System.load("/data/data/your.package.name/lib/libXY.so")
而不是 System.loadLibrary()。
答案 13 :(得分:0)
此问题解决了UnsatisfiedLinkerror。再次通过“ndk_build”构建.so文件
答案 14 :(得分:0)
有同样的问题。 刚刚清理了项目并且工作正常。神秘..
答案 15 :(得分:0)
在gradle文件中添加以下代码
//libs is the location of your library's folder, It varies in diffarent projects like src/main/libs etc.
android {
sourceSets.main {
jniLibs.srcDir 'libs'
}
}
因此,Android Studio继续在jniLibs文件夹中查找本机库。此代码将更改android studio的路径,以在libs文件夹中查找libs
答案 16 :(得分:0)
就我而言,.so 库已正确加载,但找不到如下方法:
<块引用>引起:java.lang.UnsatisfiedLinkError: Native method not found...
经过数小时的搜索可能是什么问题,注意到应用程序仅针对生产风格抛出相关错误。是的,我们使用 proguard 来混淆源代码,它破坏了 .so 库处理程序类......在将以下几行添加到 proguard 规则文件中之后。它开始按预期工作。
-keepclasseswithmembers,allowshrinking,allowoptimization class com.zk.android.jni.Device {
native <methods>; }
因此,如果您使用 proguard 并且遇到与我类似的问题。请检查 proguard 文件...