如何加载android系统本机库

问题描述 投票:1回答:1

我写了一个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。

谢谢

android c++ android-studio java-native-interface native
1个回答
1
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.