如何加载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 放入您的库中可能会减少嵌入到您的库中的依赖项的数量应用
我写了一个 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 放入您的库中可能会减少嵌入到您的库中的依赖项的数量应用