NDK中, 如何调用系统级的私有动态库

来源:互联网 发布:虚拟化服务器软件 编辑:程序博客网 时间:2024/04/29 09:18

转自:http://my.oschina.net/erehmii/blog/137302

[概述]

在某些特定的情况下, 我们想去调用系统的私有动态库, 比如libutils, libbinder等, 但是又不想在应用范围内重新编译一份系统代码, 这时, 我们可按后文中的方法操作. 可能的风险是, 如果被调用的动态库的后续版本并不向前兼容C接口, 就会带来问题. 因此如果应用本身只是针对Android的个别版本开发的话, 还是行之有效的方法.

何为私有? 可以打开Android NDK的安装目录, 并进入 android-ndk-r8\platforms\android-14\arch-arm\usr\lib (这里只是ARM平台的)看一下, 这个目录是Google开放出来的C接口动态库的保存目录.
p.s.我安装的NDK版本是r8

[解决方法]

  1. 获取必需的头文件, 保存到 JNI 的子目录;
  2. 生成需要调用的 SO, 并输出到任一临时目录, 以保证正常编译. 值得注意的是, 不要输出到 libs\armeabi(-v7a)中, 以免被打包到 APK;
  3. 编辑 Android.mk, 在 LOCAL_LDLIBS 参数中添加 -L 附加库文件目录, 并指向上述的临时目录, 这时你就可以随意调用那些so了.
  4. 值得注意的是, 这些系统级的动态库都是不需要应用的JAVA层去主动加载的 (如果应用自身输出动态库包含多个的话, 那么JAVA层在调用前必须根据其依赖关系按顺序逐个加载 ).
?
1
2
# Android.mk 以 utils & binder 为例
LOCAL_LDLIBS := -Ljni/android-libs-lutils -lbinder

P.S.生成/获取SO的方法比较多, 比如直接从Android机器里导出, 或者只导出所需动态库的symbols并通过脚本重新生成C文件然后重新编译出一个系统动态库的替代品(见 OpenCV4Android). 说到这里, 突然脑子里蹦出一个成语: 借尸还魂.


0 0
原创粉丝点击