-
是
Android
提供
的一种
makefile
文件,用来指定诸如编译生成
so
库名、引用的
头文件目录、需要编译的
p>
.c/.cpp
文件和
.a
静态库文件等。要掌握
jni
,就必须熟练掌握
的语法规范。
一、
文件的用途
一个
android
子项目中会存在一个或多个
文件
1
、单一的
文件
< br>直接参考
NDK
的
sample
目录下的
hello-jni
项目,在
这个项目中只有一个
文件
2
、多个
文件
如果需要编译的模块比较多,我们可能会将对应的模块放置在相应的目录
中,
这样,我们可以在每个目录中定义对应的
文件(类似于上面的写法),
最后,在根目录放置一个
文件,内容如下:
< br>
include $$(call all-subdir-
makefiles)
只需要这一行就可以了,它的作用就是包含所有子目录中的
p>
文件
3
、多个模块共用一个
这个文件允许你将源文件组织成模块,这个模块中含有:
-
静态库
(.a
< br>文件
)
-
动态库
(.so
文件
)
只有
共享库才能被安装
/
复制到您的应用软件(
APK
)包中
include
$$(BUILD_STATIC_LIBRARY)
,编译出的是静态库
include $$(BUILD_SHARED_LIBRARY)
,编译出的是动态库
二、自定义变量
以下是在
中
依赖或定义的变量列表,
可以定义其他变量为自己使用,
但是<
/p>
NDK
编译系统保留下列变量名:
-
以
LOCAL_
开头的名字(例如
LOCAL_MODULE
)
-
以
PRIVATE_, NDK_
或
APP_
开头的名字(内部使用)
-
小写名字(内部使用,例如
?my
-
dir?
)
如果为了方便在
中定义自己的变量,建议使用
MY_
前缀,一个小例子:
MY_SOURCES := foo.c
ifneq
($$(MY_CONFIG_BAR),)
MY_SOURCES +=
bar.c
endif
LOCAL_SRC_FILES
+= $$(MY_SOURCES)
注意:
?:=?
是赋值的意思;
'+='
是追加的意思;
?$$?
表示引用某变量的值。
三、
GNU
Make
系统变量
这些
GNU
Make
变量在你的
文件解析之前,
就由编译系统定义好了。
注意在
p>
某些情况下,
NDK
可能分析
几次,每一次某些变量的定义会有不同。
(
1
)<
/p>
CLEAR_VARS:
指向一个编译脚本,几乎所有未定义的
LOCAL_XXX
变量都在
节中列出。必须在开始一个新模块之前包含这个脚本:
include
$$(CLEAR_VARS)
,
用于重置除
LOCAL_PATH
变量外的,
所有
LOCAL_XXX
系列变
量。
(
2
)<
/p>
BUILD_SHARED_LIBRARY:
指向编译脚本,根据所有的在
LOCAL_XXX
变量把
列出的源
代码文件编译成一个共享库。
注意,
必须至少在包含这个文件之前定义
LOCAL_MODULE
和
LOCAL_SRC_FILES
。
(
3
)<
/p>
BUILD_STATIC_LIBRARY:
一个
BUILD_SHARED_LIBRARY
变量用于编译一
个
静态库。静态库不会复制到的
APK
包中,但是能够用于编译共享库。
示例:
include
$$(BUILD_STATIC_LIBRARY)
注意,这将会生成一个名为
lib$$(LOCAL_MODULE).a
的文件
(
4
)
TARGET_ARCH:
目标
CPU
平台的名字
(
5
)<
/p>
TARGET_PLATFORM:
解析的时候,目标
Android
平台的名字
.
详情可
< br>考
/development/ndk/docs/stable- .
android-3 -> Official Android
1.5 system images
android-4 ->
Official Android 1.6 system images
android-5 -> Official Android 2.0 system images
(
6
)<
/p>
TARGET_ARCH_ABI:
暂时只支持两个
value
,
armeabi
和
armeabi-v7a
。。
(
7
)<
/p>
TARGET_ABI:
目标平台和
ABI
的组合,
四、模块描述变量
下面的变量用于向编译系统描述你的模块。
应该定义在
'include
$$(CLEAR_VARS)'
和
'include
$$(BUILD_XXXXX)'
之间。
$$(C
LEAR_VARS)
是一个脚本,清除所有这些变量。
(
1
)<
/p>
LOCAL_PATH:
这个变量用于给出当前文件的路径。
必须在
的开头定义,可以这样使用:
LOCAL_PATH :=
$$(call my-dir)
如当前目录下有个文件夹名称
src
,则可以这样写
$$(call
src)
,那么就会得到
src
目录
的完整路径
这个变量不会被
$$(C
LEAR_VARS)
清除,因此每个
只需要定义一次
(
< br>即使在
一个文件中定义了几个模块的情况下
)
。
(
2
)
LOCAL_MODULE:
这是模块的名字,它必须是唯一的,而且不能包含空格。
必须在包含任一的
$$(
BUILD_XXXX)
脚本之前定义它。模块的名字决定了生成文件的名
字。
(
3
)
LOCAL_SRC_FILES:
这是要编译的源代码文件列表。
只要列出要传递给编译器的文件,因为编译系统自动计算依赖。注意源代码文件名称都<
/p>
是相对于
LOCAL_PATH
的,你可以使用路径部分,例如:
LOCAL_SRC_FILES := foo.c toto/bar.c
Hello.c
文件之间可以用空格或
Tab
键进行分割
,
换行请用
如果是追加源
代码文件的话,请用
LOCAL_SRC_FILES +=
注意:可以
LOCAL_SRC_FILES :=
$$(call all-subdir-java-files)
这种形式来包含
local_path
目录下的所有
java
文件。
(
4
)
LOCAL_C_INCLUD
ES:
可选变量,表示头文件的搜索路径。
默认的头文件的搜索路径是
< br>LOCAL_PATH
目录。
(
5
)
LOC
AL_STATIC_LIBRARIES:
表示该模块需要使用哪些静态库,以便在
编译时进行
链接。
(
6
)
LOCAL_SHA
RED_LIBRARIES:
表示模块在运行时要依赖的共享库(动态库),在<
/p>
链接时就需要,以便在生成文件时嵌入其相应的信息。
注意:它不会附加列出的模块到编译图,也就是仍然需要在
中把它们添
加到程序要求的模块中。
-
-
-
-
-
-
-
-
-
上一篇:Android.mk的文件语法规范
下一篇:体育比赛用语