1、NDK作用
用于扩展android sdk功能,实现一些对代码性能要求较高的模块,并将这些模块嵌入的android应用程序中。
2、代码结构
我们的NDK模块源代码由 C/C++ 头/源文件 + make文件组成,这些文件必须放在jni目录下!
理论上,我们的jni目录可以放在任何地方,例如我们放在 X/jni/ 下,在 X/jni/ 下执行ndk-build之后会在 X/ 下(即jni同级目录下)产生编译结果(即libs和obj文件夹)。
在Android Studio项目里,我们一般把jni目录放在项目根目录(即src同级目录)下,这样我们编译出来的libs和obj将会位于项目根目录下。如果要把这些编译好的C/C++库打包到apk里面供java调用,我们还必须在Module的build.gradle里面加上下面的代码:
android {
...
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
...
}
3、Android.mk文件
Android.mk是一个负责向NDK构建系统描述NDK项目的GUN Makefile片段,是每一个NDK项目的必备组件。
根据GUN Make的命名规则,变量名要大写。
4、Android.mk基本要素
4.1、Android.mk必须以 LOCAL_PATH开头(注释#除外)
LOCAL_PATH := $(call my-dir)
4.2、必须借助CLERA_VARS变量清除除LOCAL_PATH外的所有LOCAL_<name>变量,以免冲突
include $(CLEAR_VARS)
4.3、必须定义LOCAL_MODULE变量,该变量用于定义该模块的唯一名称。例如,
LOCAL_MODULE := fuck
这样,编出的C/C++模块文件名将是libfuck.so
4.4、通过LOCAL_SRC_FILES变量设置源文件列表,多文件用“\”隔开,例如
LOCAL_SRC_FILES := aaa.cpp \
bbb.cpp \
ccc.cpp
注意,最后一个源文件结尾不加“\”
4.5、必须在文件结尾定义编译类型
我们可以将我们的NDK模块编译成:
BUILD_SHARED_LIBRARY 共享库,供java或者其他共享库调用
BUILD_STATIC_LIBRARY 静态库,供共享库调用,不能直接被java调用。例如我们先构建一个静态库 LOCAL_MODULE := fuck_static,那么我们可以在构建共享库的时候加入 LOCAL_STATIC_LIBRARIES := fuck_static (写在LOCAL_SRC_FILES之后)来引用这个静态库。
还有其他编译类型,再次不一一列举!
我们可以在一个Android.mk文件里面定义多个相同或者不同类型的库,这些库定义以Include $(CLEAR_VARS)开始,以定义编译类型结束。例如:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := fuck_static
#fuck_static的源文件定义
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := fuck_shared_1
#fuck_shared_1的源文件定义
LOCAL_STATIC_LIBRARIES := fuck_static
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := fuck_shared_2
#fuck_shared_2的源文件定义
include $(BUILD_SHARED_LIBRARY)
注意,如果在共享库中使用LOCAL_STATIC_LIBRARIES引用静态库,那么这个静态库将被静态地添加到该共享库中,这种方式代码运行效率是最高的,但是同时会增加该共享库的体积。如果某个静态库被多个共享库同时引用n次,静态库的n个副本将被添加到这些共享库中,这样会显著增加C/C++库集合的体积。
这样的话,就需要将这个静态库编译成共享库,通过动态链接的方式供其他共享库使用(这样就不会产生相同C/C++库的多个副本)。
例如:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := fuck_shared
#fuck_shared的源文件定义
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := fuck_shared_1
#fuck_shared_1的源文件定义
LOCAL_SHARED_LIBRARIES := fuck_shared
include $(BUILD_SHARED_LIBRARY)