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
[解决方法]
- 获取必需的头文件, 保存到 JNI 的子目录;
- 生成需要调用的 SO, 并输出到任一临时目录, 以保证正常编译. 值得注意的是, 不要输出到 libs\armeabi(-v7a)中, 以免被打包到 APK;
- 编辑 Android.mk, 在 LOCAL_LDLIBS 参数中添加 -L 附加库文件目录, 并指向上述的临时目录, 这时你就可以随意调用那些so了.
- 值得注意的是, 这些系统级的动态库都是不需要应用的JAVA层去主动加载的 (如果应用自身输出动态库包含多个的话, 那么JAVA层在调用前必须根据其依赖关系按顺序逐个加载 ).
12# Android.mk 以 utils & binder 为例
LOCAL_LDLIBS := -Ljni
/android-libs
-lutils -lbinder
1
2
# Android.mk 以 utils & binder 为例
LOCAL_LDLIBS := -Ljni
/android-libs
-lutils -lbinder
P.S.生成/获取SO的方法比较多, 比如直接从Android机器里导出, 或者只导出所需动态库的symbols并通过脚本重新生成C文件然后重新编译出一个系统动态库的替代品(见 OpenCV4Android). 说到这里, 突然脑子里蹦出一个成语: 借尸还魂.
0 0
- NDK中, 如何调用系统级的私有动态库
- NDK动态库的调用
- NDK动态库的调用
- NDK动态库的调用
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- Android NDK中调用第三方的动态库
- elipse中jni实现动态链接库编译及调用(Mac系统/ndk r10b)
- Android-ndk 调用现有的动态库
- 关于NDK动态链接库中调用动态链接库一种错误的解决办法
- NDK如何调试系统核心动态库(无系统源码的情况)
- NDK学习(3) 动态库的编译与在动态库中调用编译的动态库
- NDK动态链接库的编译和调用
- 回归-普通最小二乘法(OLS)解析式推导
- 基于Zxing 字符串生成二维码
- iOS多线程——NSOperation & NSOperationQueue
- 学习使用gradle
- 人际交往中的角色
- NDK中, 如何调用系统级的私有动态库
- select、poll、epoll之间的区别总结
- Python 3 collections.defaultdict() 与 dict的使用和区别
- Palindrome Linked List
- windows下使用cmd命令远程重启tomcat服务
- BZOJ 3239 Discrete Logging BSGS
- Mac系统下安装ant
- iOS 动画效果
- windows 文档导入linux中的一些特殊字符