安卓使用原生代码一般都是以编译成动态库的形式直接在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)
**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