zoukankan      html  css  js  c++  java
  • 详解android.mk-2016.01.18

    1 Android.mk作用

    当使用JNI开发时,我们需要创建一个native工程,Android.mk就是一个makefile的配置文件,帮助我们把编写的C/C++代码编译成动态或者静态的链接库。

    2 示例解析

    下面使用一个最简单的Android.mk配置文件引导生成.so动态库。Android.mk文件内容如下:

    LOCAL_PATH := $(call my-dir)  
    LOCAL_CPP_EXTENSION := .cpp
    include $(CLEAR_VARS)  
    LOCAL_MODULE := jni_demo
    LOCAL_SRC_FILES := jni_demo.cpp
    LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
    include $(BUILD_SHARED_LIBRARY)

    第一行: LOCAL_PATH变量用来查找C/C++源文件,my-dir是一个由编译系统提供的宏函数,用于返回Androi.mk文件所在的目录的路径。call函数与GNU makefile中函数意义相同,具体用法可以参见陈皓“跟我一起学Makefile”中的用法。$()是一个引用变量操作符。综上所述,第一行的含义就是,先调用宏函数“my-dir”获取Android.mk文件所在目录路径,然后将Android.mk文件所在路径赋值给LOCAL_PATH变量。

    第二行: LOCAL_CPP_EXTENSION变量指定源码文件扩展名

    第三行: CLEAR_VARS定义在${NDK_TOOL_PATH}uildcore路径下的build-all.mk文件中,其中NDK_TOOL_PATH指ndk安装根目录。CLEAR_VARS := $(BUILD_SYSTEM)/clear-vars.mk,打开clear-vars.mk文件,查看其注释可知,该mk文件主要用于清除模块内部变量内容,但不会清除LOCAL_PATH的内容。另外,CLEAR_VARS在每个模块文件中应该重复调用。

    第四行: LOCAL_MODULE必须定义,文件名必须唯一,而且不能包含空格,另外,编译器可能会添加一些前缀和后缀,来保证文件是一致的,其作用用来指定编译后的模块名称,如上所示,上述的mk文件编译出来的动态库名称将为libjni_demo.so

    第五行: 指定编译的源文件,并且文件名都是相对于LOCAL_PATH目录的。多个文件之间可以使用空格或者Tab键分割,可以使用“”续行。如果追加源代码文件的话,使用“LOCAL_SRC_FILES +=”。关于源码文件编写列表可以参考“编写Android.mk中的LOCAL_SRC_FILES的终极技巧

    第六行: 指定该模块依赖的其他库。-L指定库的路径,-l指定库的名称。

    第七行: 执行编译动态库命令,编译动态库。其他可以执行命令:

    BUILD_SHARED_LIBRARY #生成一个动态库
    BUILD_STATIC_LIBRARY #生成一个静态的库
    BUILD_PACKAGE #生成一个APK

    3 变量使用

    在Android.mk中,同样可以使用变量,并且变量可以在mk文件和cpp文件中使用,具体使用方式如下:

    在Android.mk文件中使用变量

    USE_VAR := YES
    ifeq ($(USE_VAR), YES)
    
    else
        
    endif

    在cpp文件中使用mk文件中定义的变量,在mk文件中使用“变量 := -D+变量名”形式定义变量,然后追加到LOCAL_CFLAGS变量中,否则定义的变量将不会生效。

    //cpp
    #ifdef TCC_MEM_512MB
        LOGD("TCC_MEM_512MB define in here");
    #endif
    #mk
    BOARD_MEM_FLAGS := -DTCC_MEM_512MB
    LOCAL_CFLAGS += $(BOARD_MEM_FLAGS)

    LOCAL_CFLAGS表示编译器选项,其中有一个作用就是用来定义宏,例如,上面的在cpp文件中使用mk中定义的宏,可以简写成如下形式:

    LOCAL_CFLAGS := -DTCC_MEM_512MB

    4 源文件列表编写

    在参考资料“编写Android.mk中的LOCAL_SRC_FILES的终极技巧”中,详细介绍了如何使用简单有效的手段编写编译的源文件列表,因此,此处不再赘述。

    5 使用cygwin+NDK实现JNI开发

    安装好cygwin后,按照如下方式配置NDK环境变量:

    a.修改C:cygwinhomeAdministrator目录下.bash_profile文件,添加如下内容:

    NDK=/cygdrive/d/program/android/ndk/
    
    export NDK

    NDK变量中“d/program/android/ndk/ ”代表本机NDK安装路径,需要按照自己机器路径替换,配置好.bash_profile文件后,使用source .bash_profile命令使配置生效。

    b.查看PATH环境变量中,是否配置了NDK安装路径,如果没有,请自行添加。

    image

    c.在Eclipse中配置NDK_BUILDER编译器

         在工程名称上右击—>Properties—>Builder—>New,在弹出的对话框中填入如下的配置信息,根据个人安装环境配置:

    image

    其中Arguments中的”e/demo/android/JNIDemo/jni”表示你编译的项目的路径。

    d.最后将配置的NDK_BUILD编译选项置为编译过程的最开始。

    至此,完成NDK开发的全部配置编译过程。

    6 参考资料

    Android Android.mk 文件一点感悟

    编写Android.mk中的LOCAL_SRC_FILES的终极技巧

    Android.mk高级写法

    Android.mk语法规范

    在win7环境下使用cygwin+NDK实现JNI开发

  • 相关阅读:
    JAVA中的流-简介(二)
    JAVA中的流-简介(一)
    Java中内部类简介
    应用小练习-自定义栈
    集合知识点(二)
    集合知识点(一)
    JAVA中的正则表达式简介
    从头文件中学习sfr和sbit
    PCB中实现元器件旋转一个角度放置
    DXP中插入LOGO字体方法(2)
  • 原文地址:https://www.cnblogs.com/zhouLee/p/5139156.html
Copyright © 2011-2022 走看看