首页 > 解决方案 > 如何加载android系统原生库

问题描述

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

这些库有一些系统依赖项,如 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。

谢谢

标签: androidc++android-studiojava-native-interfacenative

解决方案


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

如果您将所有依赖项静态链接到mynative-lib.

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

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

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


推荐阅读