如何加载android系统原生库

How to load android system native library

我写了一个 c++ 本机库,它有一些依赖项(最著名的是 Qt),我想通过标准 Android Java 应用程序中的 jni 调用它。我目前正在使用 Android Studio,但这并不是强制性的。

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

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

我目前在主activity中的代码是这样的:

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。

谢谢

这是一个有效的可能性。仍然存在这样的风险,即当您添加库时,如果您不注意,您可能 link 它们的顺序错误。

如果您 link 将所有依赖项静态地放入 mynative-lib,您可能会有一个更精简的版本。

你最终会得到一个更短的加载代码:

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

这也会减少您的 jniLibs 文件夹(以及 APK)的大小,因为将您的依赖项静态 link 放入您的库中可能会减少嵌入到您的库中的依赖项的数量应用