美文网首页
NDK开发之Android.mk与Application.mk详

NDK开发之Android.mk与Application.mk详

作者: 满天星爱我 | 来源:发表于2018-02-25 18:39 被阅读30次

Android.mk

  • LOCAL_PATH
    Android.mk必须要指定LOCAL_PATH变量,用于查找源文件,一般情况下Android.mk文件和需要编译的源文件在同一目录下,如:
    LOCAL_PATH:=$(call my-dir)
    表示本mk文件所在目录路径。

  • include $(CLEAR_VARS)
    编译工具函数, 通过该函数可以进行一些初始化操作;
    CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,清楚它们可以避免冲突,每一个原生组件被称为一个模块。如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

  • LOCAL_MODULE
    用来给这些模块设定一个唯一的名称,编译后的 .so 后缀文件叫什么名字,如:
    LOCAL_MODULE := hello-jni

  • LOCAL_SRC_FILES
    指定编译的源文件名称,如:
    LOCAL_SRC_FILES:= hello-jni.c

  • include $(BUILD_SHARED_LIBRARY)
    告诉编译器需要生成(共享)动态库(.so后缀的文件);

  • include $(BUILD_STATIC_LIBRARY)
    告诉编译器需要生成静态库(.a后缀的文件);

  • LOCAL_SHARED_LIBRARIES
    可链接动态库

  • LOCAL_STATIC_LIBRARIES
    可链接静态库

  • LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib –llog
    表示允许打印Log

Application.mk

要将C\C++代码编译为SO文件,光有Android.mk文件还不行,还需要一个Application.mk文件。
Application.mk目的是描述在你的应用程序中所需要的模块(即静态库或动态库)。
Application.mk文件通常被放置在PROJECT/jni/Application.mk下,PROJECT指的是您的项目。

Application.mk中的变量:
  • APP_PROJECT_PATH
    这个变量是强制性的,并且会给出应用程序工程的根目录的一个绝对路径。这是用来复制或者安装一个没有任何版本限制的JNI库,从而给APK生成工具一个详细的路径。

  • APP_MODULES
    这个变量是可选的,如果没有定义,NDK将由在Android.mk中声明的默认的模块编译,并且包含所有的子文件(makefile文件)
    如果APP_MODULES定义了,它不许是一个空格分隔的模块列表,这个模块名字被定义在Android.mk文件中的LOCAL_MODULE中。注意NDK会自动计算模块的依赖

  • 注意:NDK在R4开始改变了这个变量的行为,在此之前:
    在您的Application.mk中,该变量是强制的,必须明确列出所有需要的模块

  • APP_OPTIM
    “release”模式是默认的,并且会生成高度优化的二进制代码。"debug"模式生成的是未优化的二进制代码,但可以检测出很多的BUG,可以用于调试。

  • 注意:如果你的应用程序是可调试的(即,如果你的清单文件中设置了android:debuggable的属性是"true")。默认的是"debug"而不是"release"。这可以通过设置APP_OPTIM为"release"来将其覆盖。
    可以在"release"和"debug"模式下一起调试,但是"release"模式编译后将会提供更少的BUG信息。在我们清楚BUG的过程中,有一些变量被优化了,或者根本就无法被检测出来,代码的重新排序会让这些带阿弥变得更加难以阅读,并且让这些轨迹更加不可靠。

  • APP_CFLAGS
    当编译模块中有任何C文件或者C++文件的时候,C编译器的信号就会被发出。这里可以在你的应用中需要这些模块时,进行编译的调整,这样就不许要直接更改Android.mk为文件本身了

  • APP_BUILD_SCRIPT
    默认情况下,NDK编译系统会在(APP_PROJECT_PATH)/jni目录下寻找名为Android.mk文件:(APP_PROJECT_PATH)/jni/Android.mk

  • APP_ABI
    默认情况下,NDK的编译系统会为armeabiABI生成机器代码。喜爱哪个相当于一个基于CPU可以进行浮点运算的ARMv5TE。你可以使用APP_ABI来选择一个不同的ABI,如在ARMv7的设备上支持硬件FPU指令,则可以使用:
    APP_ABI = armeabi-v7a
    或者为了支持IA-32指令集,可以使用
    APP_ABI = x86
    或者为了同时支持这三种,可以使用
    APP_ABI = armeabi armeabi-v7a x86
    如要支持android的所有cpu架构则可以使用:
    APP_ABI = all`

  • APP_PLATFORM:=android-8
    设置支持的最低android平台,可以不弄

相关文章

网友评论

      本文标题:NDK开发之Android.mk与Application.mk详

      本文链接:https://www.haomeiwen.com/subject/eynrxftx.html