目前网上通过JNI方式ndk编译,mk文件写法乱七八糟,没有固定的写法,让人看不懂。所以我决定看一下官网是的说明。
直入主题吧:
An Android.mk
file is written to describe your sources to the build system. More specifically:
-
The file is really a tiny GNU Makefile fragment that will be parsed one or more times by the build system. As such, you should try to minimize the variables you declare there and do not assume that anything is not defined during parsing.
-
The file syntax is designed to allow you to group your sources into 'modules'. A module is one of the following:
- A static library.
- A shared library.
- A standalone executable.
这个是官网的描述,总结就是Android.mk文件就是用来源码编译成android系统识别的库。
首先看一个简单例子
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
获取当前编译对象的路径,以下用到的路径都是基于这个路径做出的动作,LoCAL_PATH是一个变量,你可以随便自己取一个名字(阿猫阿狗都行哦),$(call my-dir),这个是真正获取当前路径的方法。
include $(CLEAR_VARS)
include $(BUILD_SHARED_LIBRARY)/
include $(BUILD_STATIC_LIBRARY)
这一组是成对出现的,前者是开始,后者是结束,其他动作都是在他们之间完成的。
include $(CLEAR_VARS)就是初始化当前环境,在android看来就是初始化GNU环境,具体什么东东就没有去深究了,只知道他是用来初始化的就足够了。
include $(BUILD_SHARED_LIBRARY)/include $(BUILD_STATIC_LIBRARY)这个就是指定生成库的形式,是动态库还是静态库。
好了,框架就是这样,然后我们就在
include $(CLEAR_VARS)
include $(BUILD_SHARED_LIBRARY)/
include $(BUILD_STATIC_LIBRARY)
之间添砖加瓦吧。
LOCAL_MODULE := hello-jni
这个是指定输入,生成库的名称,实际上名称是前加“lib”,后加“.so”/".a",貌似有点像Linux,反正android就是从Linux来的,我们就不去深究啦,知道怎么回事就行。
LOCAL_SRC_FILES :=hello-jni.c
这个就是指定需要编译的源码,写法有很多种的,自定义文件夹加入等等,这里我不去展开,有时间我会深究一下的。
上述例子没有加上的:
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/include
这个就是指定需要用到的头文件的目录,就在该目录的include文件夹下,你也可以加上很多其他路径下的头文件
LOCAL_LDLIBS := -lz
这个呢,就是连接系统一些库了,可能我们编译的时候报的一些错误,需要依赖系统的一些库的。如-lxx,就是连接某一个系统动态库。
LOCAL_SHARED_LIBRARIES := hello-jni1
这个呢是链接我们自己的第三方的动态库。
LOCAL_STATIC_LIBRARIES 这个一样,是链接我们自己的第三方的静态库。
LOCAL_CFLAGS += -Dxxx这个就是你在源码定义的宏,需要定义的话就在这个参数上加上-Dxxx,前面加"-D",
后面就是宏的名称了。
好了,今天就简单的介绍了一下Android.mk文件的基本写法。有时间我会研究一下链接问题,和一些不常用的变量及其用法的。
谢谢大家,由于能力有限,希望大家多多批评指正。