安卓JNI下的静态库和动态库编译及使用

安卓使用原生代码一般都是以编译成动态库的形式直接在Java中应用
当需要构建大型项目的时候,一般希望向上层提供一个动态库,而内部能够引用多个静态库
分模块的形式达到解耦合的目的

以实例说明,编译生成静态库后,在动态库中引用静态库,并最终生成一个动态库提供到上层

生成静态库 Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := static_showname
LOCAL_SRC_FILES  := ShowName.c

LOCAL_LDLIBS :=-llog

LOCAL_PRELINK_MODULE := false
LOCAL_ARM_MODE := arm


include $(BUILD_STATIC_LIBRARY)
$(call import-module,android/cpufeatures)
生成动态库 Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := static_showname
LOCAL_SRC_FILES  := ShowName.c

LOCAL_LDLIBS :=-llog

LOCAL_PRELINK_MODULE := false
LOCAL_ARM_MODE := arm


include $(BUILD_STATIC_LIBRARY)
$(call import-module,android/cpufeatures)
![这里写图片描述](https://img-blog.csdn.net/20180308135142737?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJlYW1JblRoZVdvcmxk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
上面是两者的区别。

**CLEAR_VARS **
清除编译环境下遗留下来的一些变量值,一般编译开始之前调用确保编译的运行环境更纯粹。

**LOCAL_MODULE **
编译后生成的动态库或者静态库的名称

LOCAL_LDLIBS
引用动态库

LOCAL_PRELINK_MODULE
Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快启动速度,还可以减少部分内存开销,
是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具
Prelink的这种做法当然也有代价:每次更新动态共享库时,相关的可执行文件都需要重新执行一遍Prelink才能保证有效,
因为新的共享库中的符号信息、地址等很可能与原来的已经不同了
这就是为什么 android framework代码一改动,这时候就会导致相关的应用程序重新被编译。
变量设置为false那么将不做prelink操作

LOCAL_ARM_MODE
设置使用arm指令集生成二进制文件
ARM为32位指令集,Thumb为16位指令集
理论上32位可以提供更快的执行速度但会生成更大的二进制执行文件。
因为默认情况下NDK使用Thumb指令集,所以编译的时候有的程序员会手动指定为arm指令集编译。

BUILD_SHARED_LIBRARY
BUILD_STATIC_LIBRARY
主要是这里,区分生成的是动态库还是静态库

这里还有常用的系统中的动态库引用 LOCAL_LDLIBS :=-llog
属于动态库引用动态库的情况
一个动态库引用另外一个动态库的形式也是比较常用的
但是因为需要向上层提供两个或者两个以上的库文件,维护起来相对麻烦 所以实际项目中更多使用静态库

还需要配合Application.mk的使用

APP_PLATFORM = android-23  
APP_ABI := armeabi
APP_STL := stlport_static  
APP_OPTIM := debug  

点击查看完成项目例程源码

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值