一、如何通过NDK进行编译。
1、新建jni文件夹,并将Android.mk、Applicatio n.mk、源文件都放入其中。
2、编写Android.mk文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= test
LOCAL_C_ALL_FILES := test.c
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
include $(BUILD_EXECUTABLE)
3、编写Application.mk文件。
APP_ABI := armeabi-v7a
4、执行ndk-build命令生成bin文件。
二、Android.mk基本语法
1、Android.mk基本语法格式示例:
配置环境变量:定义当前模块的相对路径。这个变量被用来寻找C/C++源文件。在该例中,my-dir 是一个由编译系统提供的宏函数,用于返回Android.mk所在目录的路径。
LOCAL_PATH := $(call my-dir)
CLEAR_VARS是编译系统预定义的一个变量,它指向一个特殊的Makefile,这个Makefile负责清除 LOCAL_xxx 的变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES 等)但不会清除 LOCAL_PATH。之所以需要清理这些变量是因为所有的编译控制文件是在一趟make执行过程中完成的,而所有的变量都是全局的,会对其他Android.mk文件产生影响。
include $(CLEAR_VARS)
LOCAL_MODULE 用来给每个模块定义一个名字,不同模块的名字不能相同,不能有空格。这里的名字会传给NDK编译系统,然后加上lib前缀和.so后缀 (例如,变成libhello-jni.so)。注意,如果你在LOCAL_MODULE定义中自己加上了lib前缀,则ndk在处理的时候就不会再加上lib前缀了(为了兼容Android系统的一些源码)。
LOCAL_MODULE := test
编译该模块所需的源文件:使用连接符“\”连接多个源文件
LOCAL_SRC_FILES := test.c
编译所生成的目标文件的格式(类型):
include $(BUILD_EXECUTABLE)
2、编译生成的目标文件类型:
BUILD_EXECUTABLE | 二进制可执行文件 |
BUILD_SHARED_LIBRARY | 动态库.so文件 |
BUILD_STATIC_LIBRARY | 静态库.a文件,静态库不会被拷贝到你的安装包中去,它往往用来编译其他动态库。 |
BUILD_STATIC_JAVA_LIBRARY | 静态Jar包,使用.class文件打包而成的JAR文件,可以在任何java虚拟机运行 |
BUILD_JAVA_LIBRARY | 动态Jar包,在静态jar包基础上使用.dex打包而成的Jar文件,.dex是Android系统使用的文件格式 |
BUILD_PACKAGE | apk文件 |
3、Android.mk中引用资源:
LOCAL_STATIC_LIBRARIES+=libxxx | 引用系统静态库 |
LOCAL_SHARED_LIBRARIES += libxxx | 引用系统动态库 |
LOCAL_LDFLAGS := -L/PATH -lxxx | 引用第三方库文件 引入第三方动态库: LOCAL_LDFLAGS := -L ./lib/ -ltest3 或 LOCAL_LDFLAGS := -L$(LOCAL_PATH)/lib/ -ltest3 引入第三方静态库: LOCAL_LDFLAGS := $(LOCAL_PATH)/lib/libtest2.a |
LOCAL_C_INCLUDES := path | 引入第三方头文件 |
LOCAL_STATIC_JAVA_LIBRARIES := libarity android-support-v4 guava | 引入共享Jar包 |