当前位置: 代码迷 >> Android >> Android编译系一致
  详细解决方案

Android编译系一致

热度:63   发布时间:2016-05-01 20:45:20.0
Android编译系统一
Android.mk
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS) LOCAL_SRC_FILES:= /        com_ura_test_JNITest.c LOCAL_C_INCLUDES := /        $(JNI_H_INCLUDE) LOCAL_SHARED_LIBRARIES := libutils LOCAL_PRELINK_MODULE := false LOCAL_MODULE := libJNITest include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH - 编译时的目录

$(call 目录,目录….) 目录引入操作符

如该目录下有个文件夹名称Src,则可以这样写 $(call src) 等



CLEAR_VARS –

在build/core/config.mk 定义 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk

       详细看build/core/clear_vars.mk

      Include 是 *.mk 文件的运算符。可以通过include 包含自定义的.mk文件(即是自定义编译规则)或是引用系统其他的.mk文件(系统定义的编译规则)。

 

LOCAL_SRC_FILES - 编译的源文件

可以是.c, .cpp, .java, .S(汇编文件)或是.aidl等格式

写法是不同的文件用空格隔开。如果编译目录子目录,采用相对路径,如子目录/文件名。也可以通过$(call 目录),指明编译某目录下所有.c/.cpp/.java/.S/ .aidl文件.

追加文件 LOCAL_SRC_FILES += 文件



LOCAL_C_INCLUDES - 需要包含的头文件目录

     可以是系统定义路径,也可以是相对路径. 如该编译目录下有个include目录,写法是include/*.h



LOCAL_SHARED_LIBRARIES - 链接时需要的外部共享库

   还有链接的外部静态库用LOCAL_STATIC_LIBRARY

如果是java文件,要加入jar包用LOCAL_JAVA_LIBRARIES



LOCAL_PRELINK_MODULE - 是否需要prelink处理 .Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具.



LOCAL_MODULE - 编译的目标对象

module 是指系统的native code ,相对用Java 写成的 Android  application 称为package。Package用LOCAL_PACKAGE_NAME.



BUILD_SHARED_LIBRARY - 指明要编译成动态库。

编译的目标,用include 操作符,动态库会用到系统的编译脚本host_share_library.mk 编译静态库目标,会用到系统的编译脚本host_static_library.mk . 用BUILD_STATIC_LIBRARY来指明要编译成静态库。如果是java文件的话,会用到系统的编译脚本host_java_library.mk,用BUILD_PACKAGE来指明。三个编译脚本都放到build/core目录下。



LOCAL_ARM_MODE := arm

目前Android大部分都是基于Arm处理器的,Arm指令用两种模式Thumb(每条指令两个字节)和arm指令(每条指令四个字节)



LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays

通过设定编译器操作,优化级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

  

Android.mk 也通过ifeq关键字支持条件选择语句,类如下面

ifeq ($(HOST_OS),linux)

# Use the futex based mutex and condition variable

# implementation from android-arm because it's shared mem safe

  LOCAL_SRC_FILES += /

         futex_synchro.c /

         executablepath_linux.cpp

endif

ifeq ($(HOST_OS),darwin)

  LOCAL_SRC_FILES += /

         executablepath_darwin.cpp

endif

   总结,android.mk 的写法,系统源代码提供了大量的android.mk可以作为参考资料。在编写android.mk的时候,有任何碰到疑问的地方,可以拿系统的android.mk看看, 相信写个android.mk 应该没有什么困难.

参考资料:http://blog.csdn.net/wukunting/article/details/4640100
  相关解决方案