Android APK在右侧目录中没有.so

时间:2011-02-25 07:10:00

标签: android eclipse shared-libraries android-ndk

我正在使用Eclipse 3.6开发一个相对简单的Android NDK项目。我构建了我的共享库没有问题,ndk-build将它放在libs / armae​​bi中(注意:我没有在我的Android.mk或Application.mk文件中指定该目录)。当我试图在模拟器上运行项目时,我得到了一个UnsatisfiedLinkError。

然后我经历了所有事情,确保我调用了System.loadlibrary,验证了我的标题等等,一切都很好。最后,我注意到logcat说它正在寻找../lib 而不是 ../libs/armeabi中的文件。然后我手动创建了一个lib目录并将我的.so放在那里,但仍然遇到了同样的错误。当我解压缩APK时,我可以看到Eclipse仍然将它放在../lib/armae​​bi目录中。我尝试删除/添加项目,寻找设置等,没有运气。

我的问题是:到底发生了什么事?这件事真的很蠢吗?在某处我似乎无法找到的设置?或者它是否以某种方式依赖于API版本? Eclipse如何决定放入.so的目录,因为它显然忽略了我在项目中的结构!

提前感谢所有人。

-Pavel

3 个答案:

答案 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);
    }
}

从日志中提供确切的错误可能会有所帮助。