我正在使用Eclipse 3.6开发一个相对简单的Android NDK项目。我构建了我的共享库没有问题,ndk-build将它放在libs / armaebi中(注意:我没有在我的Android.mk或Application.mk文件中指定该目录)。当我试图在模拟器上运行项目时,我得到了一个UnsatisfiedLinkError。
然后我经历了所有事情,确保我调用了System.loadlibrary,验证了我的标题等等,一切都很好。最后,我注意到logcat说它正在寻找../lib 而不是 ../libs/armeabi中的文件。然后我手动创建了一个lib目录并将我的.so放在那里,但仍然遇到了同样的错误。当我解压缩APK时,我可以看到Eclipse仍然将它放在../lib/armaebi目录中。我尝试删除/添加项目,寻找设置等,没有运气。
我的问题是:到底发生了什么事?这件事真的很蠢吗?在某处我似乎无法找到的设置?或者它是否以某种方式依赖于API版本? Eclipse如何决定放入.so的目录,因为它显然忽略了我在项目中的结构!
提前感谢所有人。
-Pavel
答案 0 :(得分:1)
Android包管理器将库安装到lib /而不是lib / armeabi,因此没有问题。 armeabi存在于APK中,因为您可以编译armeabi或armeabi-v7a,并且包管理器会为设备安装最合适的库。
UnsatisfiedLinkError很可能是由于JNI函数签名中的错误造成的。您可以通过javah
程序运行已编译的类文件来检查签名应该是什么。任何差异都是错误的原因。
答案 1 :(得分:1)
UnsatisfiedLinkError可能是可能的。如果您已编译2.2版本的库并尝试在2.1设备上运行,则可能会出现此错误。请检查一下。
答案 2 :(得分:0)
您的共享库是否链接到另一个库? Android不会为您加载依赖库;在加载依赖库之前,必须在Java 中执行此操作。以下是我的应用程序中使用NativeActivity
的示例,但会覆盖它以首先加载依赖库:
package com.audia.dev.dummyandroid;
import android.app.NativeActivity;
import android.os.Bundle;
public class DummyAndroid extends NativeActivity {
@Override
public void onCreate(Bundle savedInstanceState)
{
//load libraries we depend on first
System.loadLibrary("QtCore");
System.loadLibrary("QtNetwork");
System.loadLibrary("QtGui");
System.loadLibrary("qtandroid");
super.onCreate(savedInstanceState);
}
}
从日志中提供确切的错误可能会有所帮助。