少年辛苦终身事,莫向光阴惰寸功。这篇文章主要讲述如何加载android系统本机库相关的知识,希望能为你提供帮助。
我写了一个c ++本机库,它有一些依赖项(最值得注意的是Qt),我想通过jni从标准的android java App调用它。我目前正在使用Android Studio,但这不是必须的。
【如何加载android系统本机库】libs有一些系统依赖,如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)的大小,因为将依赖项静态链接到库中可能会减少将多少依赖项嵌入到应用程序中。推荐阅读
- Android JNI - 调用AttachCurrentThread而不使用DetachCurrentThread
- 使用Android NDK将文件写入SDcard以外的位置()
- Xamarin.Android Java绑定库运行时失败访问本机库
- 如何在tid xxxxx(Thread-X)中解决Android致命信号11(SIGSEGV),代码1,故障地址0x0()
- 如何在Android应用程序中使用Geocoder在特定位置找到大陆
- 从AppWidgetProvider到Broadcastreceiver的意图
- 如何让Android搜索栏顺利移动()
- Android中的包含布局已拉长
- 最好的开源渗透和安全测试(黑客)Linux操作系统