android - 如何加载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。
谢谢
解决方案
这是一个有效的可能性。添加库时,如果您不注意,可能会以错误的顺序链接它们,这仍然存在风险。
如果您将所有依赖项静态链接到mynative-lib
.
你最终会得到一个更短的加载代码:
static {
System.loadLibrary("gnustl_shared");
System.loadLibrary("mynative-lib-with-deps");
}
这也将减少您的jniLibs
文件夹(以及 APK)的大小,因为将您的依赖项静态链接到您的库中可能会减少您的应用程序中嵌入的依赖项的数量。
推荐阅读
- function - 如何调试从 conky 调用的 lua 函数?
- arrays - Vue.js 多个复选框
- java - 如何引用 Java 中的引用?
- android - 从从 JSON 中提取的对象中获取到 TextView 的字符串
- java - 有效实施命令模式
- reactjs - 得到“道具A在B中被标记为需要,但它的价值是'未定义'。” 即使没有按要求设置
- python - 具有 dask 资源的 joblib parallel_backend
- kubernetes - 在非默认命名空间中运行 k8s pod 的好处
- google-apps-script - 运输申请表日期/时间问题
- python - 绘制堆积条形图中出现的百分比