如何加载android系统本机库

时间:2018-09-17 14:18:05

标签: android c++ android-studio java-native-interface native

我编写了一个具有某些依赖项(最著名的Qt)的c ++本机库,我想通过标准Android Java App中的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。

谢谢

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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