Android NDK java.lang.UnsatisfiedLinkError:findLibrary返回null

在你的Android JNI应用程序中有上述错误? 继续阅读…

在前面,我会说我已经用我自己的方式解决了这个问题,但是我感觉Android构build系统中的某些东西(可能是关于Eclipse)已经崩溃了,我希望能够节省一些时间。 也许其他人已经遇到了这个问题,并可以评论什么对他们有效。

有一段时间,我有一个Android项目,有一些使用NDK开发的JNI代码。 然后,今天,我改变了Java代码中的东西,然后poof,我不能再加载我的JNI库。 它失败了,例如:

E / AndroidRuntime(999):java.lang.UnsatisfiedLinkError:无法加载mylibrary:findLibrary返回null

我Googlesearch并尝试了一切(重build,closures和重新启动Eclipse等等)

什么最终解决了我的问题? 在尝试另一次运行之前,我从设备上物理卸载了我的应用程序。 而已。 之后,它的工作。 什么对你有用?

如果你有一个本地项目LOCAL_MODULE“libXYZ”,一定要加载它

System.loadLibrary("XYZ"); 

如果您尝试在模拟器中运行您的应用程序,请确保您已经在运行 – >运行configuration – >目标中指定了正确的体系结构(您可能需要使用窗口 – > Android虚拟设备pipe理器添加所需的模拟器)。

在尝试在Intel模拟器中执行应用程序时,我遇到了同样的问题,而应用程序正在使用为ARM预编译的库。

我也有这个问题,但对于我的情况,我在另一个项目中使用我的库。 我不认为这是一个月食或android-ndk的问题。

你可能会检查这些技巧,可能导致UnsatisfiedLinkError ,它对我来说很好,祝你好运:)

  1. 必须遵循JNI接口的命名规则(你说你之前成功加载过库,所以你可以忽略这个),库必须在/your project/libs/armeabi/
  2. 如果你确保完成了上面的事情,那么你必须确保你生成的库已经安装到你的app.apk中,否则它将仍然无法find你的lib和thorw错误。 要做到这一点,你右键点击你的eclipse项目名称,然后进入构buildpathconfiguration构buildpath ,在左侧菜单中,selectJava构buildpath ,然后点击右侧面板上的订单和导出选项卡, 选中之前的checkbox你的库的名称 ,然后单击确定 ,然后清理,重build并运行你的项目,你的库将被安装到app.apk,事情就完成了。

在这里输入图像说明

在这里输入图像说明

在这里输入图像说明

编辑:

  1. 总而言之,如果库没有安装到app.apk中,则会抛出UnsatisfiedLinkError ,因此无法链接成功。

在libs文件夹中,我创build一个名为armeabi-v7a的新文件夹,并将.so文件从armeabi复制到新文件夹中。 它解决了这个错误。

就我而言,在制作系统应用程序时 ,问题与​​权限有关。 将“ .so ”文件放到/system/lib//system/vendor/lib/目录后,我将默认分配的权限600修改为755.它运行良好。

我遇到了同样的问题,这是我在项目中遇到的一些问题:


  1. System.load("hello-test");System.loadLibrary("hello-test"); ;
  2. 将C函数签名更改为JNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz) :在这里您使用Java_<java_package_name>_<java-class-name>_<function-name> ;
  3. 添加NDKpath到local.properties ,在我的情况下ndk.dir=<my-path-to-ndk-directory> ; 和
  4. 更新我的build.gradle也包括在defaultConfigndk { moduleName "hello-test" }

  • 包名称: com.example.testndk
  • Java类名称: TestNDK
  • C源码名称: hello-test.c
  • 项目结构中的JNI目录位置: AndroidProjects/TestNDK/app/src/main/jni

IDE:Android Studio 0.8.1。

首先,检查你的eclipse里面的libs文件夹或android studio里的jniLibs文件夹里面的jni文件。 当你签入任何svn,交叉检查.so文件也检查。

我的情景是用Android Studio构build的。

在android studio中构build时,库.so文件或(jni)文件应位于\ src \ main \ jniLibs \ armeabi ***。so文件夹内。

因为这些文件将在eclipse中的\ libs \ armeabi ***中。

当使用eclipse和android studio构build时,你必须修改你的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构build项目。

只是有一个类似的问题。

看看你的/data/data/your.package.name/lib目录

当我在我的软件包目录,它目前显示:

 lib -> /mismatched_uid/settings_10037/fs_1000 

可能我无意中切换了sharedUserId,因此库不能再被访问。

以前的答案没有解决我的问题,但是这样做:一直以来的问题是一个必要的子目录和文件不存在。 所有我在我的libs文件夹是一个armeabi文件夹包含正确的.so文件,但应该有3个人,每个文件中有.so文件。 还不确定其他三个(armeabi-v7a,mips或x86)中的哪一个是必需的,但是我知道当我将Application.mk文件添加到与Android.mk相同的文件夹时,所有这三个都是自动生成的文件,并确保它有以下行:

 APP_ABI := all 

对我来说,那条线是那里唯一的文字。 当运行ndk-build时,Application.mk文件显然会导致创build4个文件夹,并在其中创build正确的.so文件。 一旦我获得了Application.mk,我就再次运行了ndk-build,然后在再次尝试之前在我的Eclipse项目上做了一个干净清晰的工作。 一切都运行完美。

不需要根设备。在模拟器上部署应用程序并浏览文件夹

如果您有一个使用“libXYZ.so”的本地项目,请确保设备上不存在/system/lib/libXYZ.so。 有一个痛苦的解决方法:使用

 System.load("/data/data/your.package.name/lib/libXY.so") 

而不是System.loadLibrary()

我刚刚发生这种情况,问题是设备根本没有足够的空间来安装库。 我卸载了一些其他的应用程序,然后它的工作。

我补充说

 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()); } 

那么错误消失了

有相同的问题。 刚刚清理的项目,它的工作。 神秘..

UnsatisfiedLinkerror解决了这个。通过“ndk_build”再次build立你的.so文件