Android ndk Android NDK java.lang.UnsatisfiedLink错误:findLibrary返回null

Android ndk Android NDK java.lang.UnsatisfiedLink错误:findLibrary返回null,android-ndk,java-native-interface,Android Ndk,Java Native Interface,您的Android JNI应用程序中是否存在上述错误?继续读 首先,我要说的是,我已经用自己的方式解决了这个问题,但我觉得Android构建系统中的某些东西(可能是关于Eclipse的)坏了,我希望能为其他人省去几个小时的痛苦。也许其他人也遇到过这个问题,可以评论什么对他们有效 有一段时间,我有一个Android项目,其中包含一些我使用NDK开发的JNI代码。然后,今天,我更改了java代码中的一些内容,然后砰的一声,我无法再加载我的JNI库了。它失败,出现如下异常: E/AndroidRunt

您的Android JNI应用程序中是否存在上述错误?继续读

首先,我要说的是,我已经用自己的方式解决了这个问题,但我觉得Android构建系统中的某些东西(可能是关于Eclipse的)坏了,我希望能为其他人省去几个小时的痛苦。也许其他人也遇到过这个问题,可以评论什么对他们有效

有一段时间,我有一个Android项目,其中包含一些我使用NDK开发的JNI代码。然后,今天,我更改了java代码中的一些内容,然后砰的一声,我无法再加载我的JNI库了。它失败,出现如下异常:

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

我在谷歌上搜索并尝试了一切(重建、关闭和重新启动Eclipse等)


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

只是有一个类似的问题

检查/data/data/your.package.name/lib目录

当我在我的程序包目录中登录时,它当前显示:

lib -> /mismatched_uid/settings_10037/fs_1000

可能是我不小心切换了sharedUserId,因此无法再访问库。

无需根设备。.在emulator上部署应用程序并浏览文件夹

也有相同的问题。
刚刚清理了这个项目,它成功了。神秘..

我也有这个问题,但就我的情况而言,我正在另一个项目中使用我的LIB。我不认为这是eclipse或android ndk的问题

您可以查看这些提示,它们可能会导致
不满意的链接错误
,对我来说效果很好,祝您好运:)

  • 必须遵循JNI接口的命名规则(您之前说过您确实成功加载了库,因此可以忽略此项),并且库必须位于目录
    /your project/libs/armeabi/
  • 如果您确保完成了上述操作,则必须确保生成的库已安装到app.apk中,否则它仍无法找到库并向您提示错误。为此,右键单击eclipse项目名称,进入构建路径-配置构建路径,在左侧菜单上选择Java构建路径,然后单击右侧面板上的订单和导出选项卡,选中库名称前的复选框并单击确定,然后清理、重建并运行您的项目,您的库将安装到app.apk中,事情就完成了
  • 编辑:

  • 总之,如果库未安装到app.apk中,则会抛出
    未满足的linkerror
    ,因此无法成功链接

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


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

    如果您有一个带有本地_模块“libXYZ”的本机项目,请确保将其作为

    System.loadLibrary("XYZ");
    

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

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

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

    在我的例子中,在创建系统应用程序时,问题与权限有关。将“.so”文件放入
    /system/lib/
    /system/vendor/lib/
    目录后,我将默认分配的权限600修改为755。它工作得很好

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


  • System.load(“hello测试”)更改进入
    System.loadLibrary(“hello测试”)
    
  • 将C函数签名更改为
    JNIEXPORT jstring Java_com_example\u testndk\u testndk_funcNami(JNIEnv*env,jobject thiz)
    :这里使用
    Java_uuuu
  • 将NDK路径添加到
    local.properties
    ,在我的例子中是
    NDK.dir=
    ;及
  • 正在更新我的
    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。

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

    APP_ABI := all
    

    对我来说,那一行是唯一的文本。当ndk build运行时,Application.mk文件显然会导致创建“所有”4个文件夹,并在其中创建正确的.so文件。一旦我得到Application.mk,我就再次运行ndk构建,然后在重试之前对我的Eclipse项目进行了一次清理。一切都运行得很好。

    我刚刚遇到了这种情况,问题是设备没有足够的空间容纳我
    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']
    }
    
    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());
    }
    
    //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'
      }
    }
    
    -keepclasseswithmembers,allowshrinking,allowoptimization class com.zk.android.jni.Device {
    native <methods>; }