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
,它对我来说很好,祝你好运:)
- 必须遵循JNI接口的命名规则(你说你之前成功加载过库,所以你可以忽略这个),库必须在
/your project/libs/armeabi/
- 如果你确保完成了上面的事情,那么你必须确保你生成的库已经安装到你的app.apk中,否则它将仍然无法find你的lib和thorw错误。 要做到这一点,你右键点击你的eclipse项目名称,然后进入构buildpath – configuration构buildpath ,在左侧菜单中,selectJava构buildpath ,然后点击右侧面板上的订单和导出选项卡, 选中之前的checkbox你的库的名称 ,然后单击确定 ,然后清理,重build并运行你的项目,你的库将被安装到app.apk,事情就完成了。
编辑:
- 总而言之,如果库没有安装到app.apk中,则会抛出
UnsatisfiedLinkError
,因此无法链接成功。
在libs文件夹中,我创build一个名为armeabi-v7a的新文件夹,并将.so文件从armeabi复制到新文件夹中。 它解决了这个错误。
就我而言,在制作系统应用程序时 ,问题与权限有关。 将“ .so ”文件放到/system/lib/
或/system/vendor/lib/
目录后,我将默认分配的权限600修改为755.它运行良好。
我遇到了同样的问题,这是我在项目中遇到的一些问题:
- 从
System.load("hello-test");
到System.loadLibrary("hello-test");
; - 将C函数签名更改为
JNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz)
:在这里您使用Java_<java_package_name>_<java-class-name>_<function-name>
; - 添加NDKpath到
local.properties
,在我的情况下ndk.dir=<my-path-to-ndk-directory>
; 和 - 更新我的
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。
首先,检查你的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文件
- 如何在Android NDK和STLport中使用boost库(包括shared_ptr)
- Android:如何将解码器集成到多媒体框架
- Android NDK:警告:APP_PLATFORM android-9比android:minSdkVersion 8大
- Android致命信号11(SIGSEGV)在0x636f7d89(代码= 1)。 它如何被追查?
- 官方的“Boost library”支持Android和iOS?
- 捕获在Android上运行的本机代码引发的exception
- 如何在Android shell中复制和编辑文件?
- 在Android-NDK中使用FFmpeg
- Android工作室,Gradle和NDK