android - 将 .so 文件和 jar 包装器包含到 Android 项目中

标签 android eclipse jar shared-libraries

过去 2 天我一直在 SO 和 Google 上搜索我的问题的解决方案,但我发现没有任何东西可以解决我的问题。

我正在尝试包含一个 .so 库,它带有一个 .jar 包装器,用于 .so 中的 native 函数。当我用 winrar 解压缩 jar 时,我可以看到它只包含 .class 文件 - 这正常吗?

我正在使用 Eclipse 并创建了一个新项目并将 .so 文件添加到 libs/armeabi 文件夹和 .jar 到我的项目。 enter image description here

我已设置属性,以便将 native 库位置设置为 libs/armeabi 文件夹。

我还删除了Automatically refresh Resources and Assets folder on build 以及 Force error when external jar contain native libraries 虽然我相信第二个是目前不是我的错误。

我正在使用此代码尝试将程序加载到我的手机。

public class MainActivity extends Activity {
    static {
        Log.w("MYAPP", "About to load library.");
        System.loadLibrary("libjdns_sd");
        Log.w("MYAPP", "Library loaded.");
    } 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

库应该通过静态 block 加载。

但是我的 LogCat 显示了这个输出:

11-30 18:13:47.830: W/MYAPP(9158): About to load library.
11-30 18:13:47.830: W/dalvikvm(9158): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/example/bonjourapple/MainActivity;
11-30 18:13:47.830: W/dalvikvm(9158): Class init failed in newInstance call (Lcom/example/bonjourapple/MainActivity;)
11-30 18:13:47.830: D/AndroidRuntime(9158): Shutting down VM
11-30 18:13:47.830: W/dalvikvm(9158): threadid=1: thread exiting with uncaught exception (group=0x41949898)
11-30 18:13:47.830: E/AndroidRuntime(9158): FATAL EXCEPTION: main
11-30 18:13:47.830: E/AndroidRuntime(9158): java.lang.UnsatisfiedLinkError: Couldn't load libjdns_sd from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.example.bonjourapple-2.apk,libraryPath=/data/app-lib/com.example.bonjourapple-2]: findLibrary returned null
11-30 18:13:47.830: E/AndroidRuntime(9158):     at java.lang.Runtime.loadLibrary(Runtime.java:355)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at java.lang.System.loadLibrary(System.java:525)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at com.example.bonjourapple.MainActivity.<clinit>(MainActivity.java:11)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at java.lang.Class.newInstanceImpl(Native Method)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at java.lang.Class.newInstance(Class.java:1130)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2210)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at android.app.ActivityThread.access$700(ActivityThread.java:159)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at android.os.Looper.loop(Looper.java:137)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at android.app.ActivityThread.main(ActivityThread.java:5419)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at java.lang.reflect.Method.invokeNative(Native Method)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at java.lang.reflect.Method.invoke(Method.java:525)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
11-30 18:13:47.830: E/AndroidRuntime(9158):     at dalvik.system.NativeStart.main(Native Method)

为什么没有加载库?我究竟做错了什么? 如果有人能指出我正确的方向,我将不胜感激。

最佳答案

原来我所要做的就是将 .jar 文件放入通常的 libs 文件夹并将 .so 文件放入 libs/armeabi- v7a。然后我能够加载 native 库并访问其功能。

关于android - 将 .so 文件和 jar 包装器包含到 Android 项目中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20303328/

相关文章:

java - 在另一个项目中使用jar文件

java - 如何在 Eclipse 中监听项目删除?

Android.如何使用其他应用数据?

java - 向 Eclipse 工具栏添加可调整大小的文本

java - 无法加载 XLS 变压器。请确保 Transformer 实现位于类路径中

java - 为什么Maven打出来的包没有附带依赖?

java - 安装 .jar 库时遇到困难

php - 在 Android 中将新数据添加到数据库后更新 ListView

java - 使用 RecyclerView 在屏幕上显示特定数量的列表

java - 抽屉导航错误与闪屏