如何加载android系统本机库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何加载android系统本机库相关的知识,希望对你有一定的参考价值。

我写了一个c ++本机库,它有一些依赖项(最值得注意的是Qt),我想通过jni从标准的android Java App调用它。我目前正在使用Android Studio,但这不是必须的。

libs有一些系统依赖,如libz,liblog和(作为c ++运行时)libgnustl_shared。

现在,我的问题是:我如何加载这些库?对于当前测试,我已将它们添加到我的应用程序的jniLibs文件夹中,但这不是(我认为)处理这种情况的正确方法。

我在主要活动中的当前代码是这样的:

public class MainActivity extends AppCompatActivity {
    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("gnustl_shared");
        System.loadLibrary("log");
        System.loadLibrary("opus");
        System.loadLibrary("z");
        System.loadLibrary("Qt5Core");
        System.loadLibrary("Qt5Network");
        System.loadLibrary("mynative-lib");
    }
...
}

如果我删除liblog或libz或libgnustl_shared,我会得到一个UnsatisfiedLinkError。

谢谢

答案

这是一种有效的可能性。当您添加库时,如果您不注意,可能会以错误的顺序链接它们。

如果您将所有依赖项静态链接到mynative-lib,则可能会有更精简的版本。

您最终会得到一个较短的加载代码:

static {
    System.loadLibrary("gnustl_shared");
    System.loadLibrary("mynative-lib-with-deps");
}

这也会减小jniLibs文件夹(以及APK)的大小,因为将依赖项静态链接到库中可能会减少将多少依赖项嵌入到应用程序中。

以上是关于如何加载android系统本机库的主要内容,如果未能解决你的问题,请参考以下文章

Android模拟器如何加载本机地址及访问本机服务器

Chrome-Devtools代码片段中的多个JS库

如何在 Android Studio 中禁用 android 本机调试器

使用 dexguard 加密时,在运行时加载本机库需要更多时间

Xamarin.Forms + 本机库 OpenCV

java.lang.IllegalArgumentException:无法加载本机库