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

时间:2012-01-27 18:08:17

标签: android-ndk java-native-interface

您的Android JNI应用中出现上述错误?请继续阅读...

在前面,我会说我已经用我自己的方式解决了这个问题,但我觉得Android构建系统中的某些内容(可能与Eclipse有关)已经破了,我希望能帮助别人节省数小时的痛苦。也许其他人已经遇到过这个问题,可以评论一下对他们有用的东西。

有一段时间,我有一个Android项目,其中包含一些我使用NDK开发的JNI代码。然后,今天,我在java代码中改变了一些东西,然后poof,我再也无法加载我的JNI库了。它失败了,例如:

  

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

我用Google搜索并尝试了所有内容(重建,关闭并重新启动Eclipse等)

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

17 个答案:

答案 0 :(得分:15)

如果你有一个LOCAL_MODULE“libXYZ”的原生项目,请务必将其加载为

System.loadLibrary("XYZ");

答案 1 :(得分:13)

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

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

答案 2 :(得分:11)

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

你可以查看这些可能导致UnsatisfiedLinkError的提示,它对我来说没问题,祝你好运:)

  1. 必须遵循JNI接口的命名规则(您说您之前成功加载了库,因此您可以忽略它)并且库必须在目录/your project/libs/armeabi/
  2. 如果您确保完成上述操作,那么您必须确保生成的库 已安装 到您的app.apk中,否则它仍然无法找到lib并且给你一个错误。为此,您右键单击您的eclipse项目名称,然后进入 构建路径 - 配置构建路径 ,在左侧菜单中,选择 Java Build Path ,然后点击右侧的 订单和导出 标签面板, 选中图书馆名称前的复选框 ,然后点击 确定 ,然后清理,重建并运行项目,并且你的libs将被安装到app.apk中,事情已经完成。
  3. enter image description here

    enter image description here

    enter image description here

    修改

    1. 总之,如果您的app.apk中没有安装库,则会引发UnsatisfiedLinkError,因此无法成功链接。

答案 3 :(得分:6)

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

答案 4 :(得分:6)

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

答案 5 :(得分:5)

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


  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. 将NDK路径添加到local.properties,在我的情况下ndk.dir=<my-path-to-ndk-directory>;和
  4. 更新我的build.gradle也包含在defaultConfig中:ndk { 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。

答案 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 文件...