上次翻译了官方的Android编译系统手册(http://blog.csdn.net/a345017062/archive/2010/12/24/6096795.aspx),原文比较简洁,原样翻译下来之后,实际工作中使用时有了更深入的理解,在这里详细地记录一下,用到什么记什么。
LOCAL_MODULE_TAGS
它可能的值有四个:user,eng,tests,optional,这个值决定了模块会在哪种编译模式下被编译。
当编译一个模块时(无论C/C++还是JAVA),如果想让它只在user/eng/tests这三种模式中的一种被编译的话,就取这三个值中的一个。如果想让它在任何模式下都被编译,就让它的值取optional
如果使用optional的话,需要在/build/target/product/core.mk中添加模块名字。
lOCAL_C_INLUDES
为include中的头文件增加搜索目录,这样,只需要在include里面指定文件名就可以了。比如,FlyingSurface.cpp中引用的SkCanvas
LOCAL_PRELINK_MODULE
该动态库是否进行prelink。如果自己编译一个Android没有.so库的话,这个属性必须得加上。关于这个属性的详细解释,先看一下这一篇文件http://blog.csdn.net/ccskyer/archive/2010/06/18/5677553.aspx,再参考/build/core/prelink-linux-arm.map文件。应该可以很快弄明白。
关于prelink更详细的机制,可以参考这篇文件http://www.eefocus.com/article/09-04/71629s.html
补充于2011.5.26
这里有篇文章,对CFLAGS、LDFLAGS和CPPFLAGS讲解的比较我点,更多的是优化建议:
http://blog.csdn.net/eroswang/archive/2007/12/25/1966640.aspx
补充于2011.5.27
在Android2.3.1上面工作时,发现LOCAL_MODULE_TAGS有所变化。
对于在旧版本系统中有的模块,还可以使用user,eng,tests,optional这四个中的一个。但新版本系统中特有的模块,只能使用optional,debug,tests,eng,samples五个中的一个。
补充于2011.6.9
LOCAL_SYSTEM_SHARED_LIBRARIES
如果编译时没有提供这个选项,系统编译时,会默认链接一些库,一般是libc libstdc++ libm,可以参考/build/core/combo/TARGET_linux-x86.mk中的DEFAULT_SYSTEM_SHARED_LIBRARIES这个变量的值。
如果编译时提供了这个选项,且值不是none或者空,系统编译时就不会链接默认的这几个库。比如编译libc本身时。关于这个逻辑的判断,可以参考/build/core/binary.mk。
这样链接已经编译好的第三方库,
LOCAL_PREBUILT_LIBS := liba.so libb.so
include $(BUILD_MULTI_PREBUILT)
liba.so和libb.so放到与Android.mk同一目录下,编译时,会被安装到/system/lib目录下。
参考这里:
Android编译加入第三方动态链接库文件的方法
http://zhuwenhao.com/824/%E6%8A%80%E6%9C%AF/%E8%87%AA%E7%94%B1%E8%BD%AF%E4%BB%B6%E7%A4%BE%E5%8C%BA/android/android%E7%BC%96%E8%AF%91%E5%8A%A0%E5%85%A5%E7%AC%AC%E4%B8%89%E6%96%B9%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95/
补充于2011.6.21:
LOCAL_CFLAGS
-D,增加全局宏定义。
LOCAL_CFLAGS := -DUSE_JSC
相当于在所有源文件中增加一个
#define USE_JSC
LOCAL_CFLAGS := -DUSE_COPY_BIT=1
相当于在所有源文件中增加一个
#define USE_COPY_BIT 1
还有其它的像-W等,都是传递给编译使用的。
补充于2012.4.28
使用NDK编译时碰到的一些常见问题
Q:
Android NDK: Host 'awk' tool is outdated. Please define HOST_AWK to point to Gawk or Nawk !
A:
主要原因是NDK目录下的/android-ndk-r7/prebuilt/linux-x86/bin/awk 是64位版本的。这里可以将32位系统中的awk(我的Ubuntu下是gawk)复制/android-ndk-r7/prebuilt/linux-x86/bin/目录下
参考网址:
http://stackoverflow.com/questions/8116113/problems-with-android-ndk-7-and-awk
Q:
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
A:
源码和Android.mk等没有放在jni目录下
Q:
在LOCAL_SRC_FILES中使用wildcard函数
A:
MY_FILES := $(wildcard $(LOCAL_PATH)/foo/*.c)
MY_FILES := $(MY_FILES:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES += $(MY_FILES)
参考网址:
http://www.meegozu.com/thread-1818-1-1.html
打印编译过程
ndk-build -n
使用自己的库
LOCAL_SHARED_LIBRARIES和LOCAL_STATIC_LIBRARIES
使用系统里面的库
在LOCAL_LDLIBS里面加-L和-l
LOCAL_CFLAGS只对.c使用,而LOCAL_CPPFLAGS对.c和.cpp都使用。