android学习之路(十)---- android makefile文件

1.Application.mk文件综述

1 概述

    Application.mk用来描述你的工程下的native模块, 一般放在$PROJECT/jni/Application.mk, 其中$PROJECT表示你的工程目录,这样就可以被ndk-build脚本文件找到.(注:在这种方式下,进入jni目录,即$PROJECT/jni/,然后执行ndk-build,就可以直接编译jni生成.so文件了).

    还有另外一种方法就是将Application.mk文件放在$NDK/app/<myapp>/Application.mk,其中$NDK为NDK的安装目录,<myapp>为你的应用程序名.在这种方式下,进入$NDK安装目录,然后输入make APP=<name>,即可编译你的JNI代码.此种方法是ndk-r4之前的方法,虽然出于兼容的原因目录还支持,但是不建议使用此种方法,因为第一种方法简单,且方便.

在Application.mk文件内定义了一些变量:

APP_PROJECT_PATH

此变量值必须是你工程根目录的绝对路径.这用于指定JNI生成的.so文件安装路径或拷贝路径.

注:此变量对于第一种方法是可选了,但对于第二种方法却是必须的.

APP_MODULES

 模块名

 此变量是可选的,如果没有在此文件中定义,则默认由Android.mk文件决定.

 如果在Application.mk文件中定义此变量,那么它必须是一串由空格相隔的模块名列表,并且与Android.mk文件中的LOCAL_MODULE变量定义保持一致.需要注意地是,NDK会自动计算模块所需要的依赖文件。

    注:此变量在NDK R4版本之前是在Application.mk中是必须的,所有模块必须显式地列出.

APP_OPTIM

优化选项

此变量是可选的,其值可以为'release'或'debug'.此变量用来修改优先等级.默认情况下为release.在release模式下,将编译生成被优化了的二进制的机器码,而debug模块用来生成便于调试的未被优化的二进制机器码。

需要注意地是,如果你的程序在manifest文件中的节点下<application>已经设置了android:debuggable属性为"true",则Apllication.mk文件此变量的默认值则为'debug'而不是'release',可以在Application.mk文件中将此变量值设置为'release'而覆盖其值.

虽然在两种模块下都可以调试,但是release模式下提供更少的调试信息,比如:一些变量被优化从而不能被检查,代码重组,及跟踪。

APP_CFLAGS

编译选项

可以在Application.mk文件中修改此编译选项参数,此参数可以覆盖Android.mk文件中的相同定义,从而不必去Android.mk文件中修改.

需要注意地是,这个选项里的路径必须是以顶层NDK目录为相对路径,如存在以下两个文件:

sources/foo/Android.mk 

sources/bar/Android.mk

如果在foo/Android.mk文件中想要添加bar目录,那么得这样便用:

APP_CFLAGS += -Isources/bar

如果这样使用:

APP_CFLAGS += -I$(LOCAL_PATH)/../bar

将会变成'-I$NDK_ROOT/../bar',从而出现并不是你想要的结果. 

在android-ndk-1.5_r1时,此选项中只在C代码中被支持,而C++不支持,不过现在已经被纠正了.

APP_CXXFLAGS

APP_CPPFLAGS的别名,将来此变量将会被抛弃。

APP_CPPFLAGS

C++代码的编译选项。在android-ndk-1.5_r1版本中,此变量只适用于C++,但是现在可以同时适用于C和C++。

APP_BUILD_SCRIPT

在默认情况下,NDK会在jni目录下查找Android.mk文件并使用它,如果你想修改它,那么在此变量中你可以指定一个你自己的脚本来执行,路径还是以工程顶层目录为相对路径.

APP_ABI

在默认情况下,NDK会使用'armeabi' ABI 来生成二进制机器码,这是基于ARMv5TE的浮点运算CPU,这可以通过使用此变量来选项不同的ABI(Application Binary Interface).

 

例如:支持基于armv7 FPU指令集的设备:

APP_ABI := armeabi-v7a

支持IA-32指令集:

APP_ABI := x86

同时支持三种:

APP_ABI := armeabi armeabi-v7a x86

从NDK-r7版本后,同时支持三种还可以这样写:

APP_ABI := all

有关ABI更详细的内容请参考文档:docs/CPU-ARCH-ABIS.html

APP_STL

C++标准库 
在默认情况下,NDK通过Androoid自带的最小化的C++运行库(system/lib/libstdc++.so)来提供标准C++头文件.然而,NDK提供了可供选择的C++实现,你可以通过此变量来选择使用哪个或链接到你的程序。

APP_STL := stlport_static --> static STLport library

APP_STL := stlport_shared --> shared STLport library

APP_STL := system --> default C++ runtime library

更多详细内容请参考文档docs/CPLUSPLUS-SUPPORT.html。

APP_GNUSTL_FORCE_CPP_FEATURES

在先前的NDK版本中,当使用GNU libstdc++ runtime运行库(通过设置APP_STL变量为gnustl_static或gnustl_shared)都会强制支持异常和RTTI,在有些极少情况下可能会出现问题,同时会使生成的机器码包含不必须的内容。

这种问题在NDK r7b中得到解决,但是这也意味着如果你真的需要支持异常和RTTI 的话,则必须显式声明。要么通过APP_CPPFLAGS,要么通过LOCAL_CPPFLAGS,或LOCAL_CPP_FEATURES。本变量就是为了解决此问题的.

有两个选项供选择,也可同时都选择.

exceptions -> 强制所有模块支持异常.

rtti -> 强制所有模块支持rtti.

例如:

APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti

注意:此变量是过滤变量,将来有可能不支持.所以建议不使用此变量.

2.Android.mk文件进阶教程

最近在搞android上的rtmp协议的播放,将ffmpeg编译成几个.so动态链接库之后(后面再说如何在android下编译ffmpeg源代码),就可以引用头文件并直接写自己的jni接口了,做完这些,就可以写android下的make文件了下面就介绍一下androidmake文件的写法。
首先最简单的mk文件可以参照ndk目录下samples目录中的hello-jni工程,这里讲讲如何在mk文件中引用第三方的动态和静态库以及如何引用系统库(其实我是linux小白,有说错的地方请指教)
LOCAL_PATH := $(call my-dir)//标准mk语句,指编译路径,所有mk文件第一句都是这个

//亦可以是$(call my-dir)/../../
include $(CLEAR_VARS) //清除各种变量,因为这些变量是静态全局的,如果清除,下次编译时又会用到这些变量造成出错
LOCAL_MODULE := libopencore-amrnb  //本地静态库模块的名字,这个名字在下面编译jni时需要引用
LOCAL_SRC_FILES := lib/libopencore-amrnb.a //本地静态库文件地址
include $(PREBUILT_STATIC_LIBRARY)  //PREBUILT_STATIC_LIBRARY表示先build一个静态库

/**这个模块表示引用了一个本地的动态链接库
include $(CLEAR_VARS) //同上 www.2cto.com
LOCAL_MODULE    := libswscale  //本地动态库模块的名字
LOCAL_SRC_FILES := lib/libswscale.so //本地动态库文件位置
include $(PREBUILT_SHARED_LIBRARY) //表示先build这个动态链接库
include $(CLEAR_VARS)
LOCAL_MODULE    := libavutil
LOCAL_SRC_FILES := lib/libavutil.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libavcore
LOCAL_SRC_FILES := lib/libavcore.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libavcodec
LOCAL_SRC_FILES := lib/libavcodec.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libavformat
LOCAL_SRC_FILES := lib/libavformat.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libopenal
LOCAL_SRC_FILES := lib/libopenal.so
include $(PREBUILT_SHARED_LIBRARY)

/**此模块编译自己写的jni文件
include $(CLEAR_VARS)
LOCAL_MODULE    := ffmpeg-jni  模块名字
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include  //我将所有头文件都放到了jni目录的include目录//下,这句表示所有引用头文件都到这个目录下去找(可以是:LOCAL_C_INCLUDES+=)
LOCAL_SRC_FILES := ../../test-ffmpeg-jni/ffmpeg-jni.c \  //这句表示jni文件的位置,因为我装了一个CDT插件去开发c代码,所以将jni文件都放在了另一个test-ffmpeg-jni工程下,其中../表示上级目录
                ../../test-ffmpeg-jni/openal.c \
                ../../test-ffmpeg-jni/opengl.cpp
LOCAL_SHARED_LIBRARIES := libavformat libavcodec libavutil libswscale openal 

//这个表示编译本模块需要用到的其它库,这几个名字都是前面定义的模块名
LOCAL_STATIC_LIBRARIES := libopencore-amrnb  //同上
LOCAL_LDLIBS :=  -L$(SYSROOT)/usr/lib -llog -lGLESv2//表示使用了系统的log库和GLESv2库
include $(BUILD_SHARED_LIBRARY)   //注意与前面的不同之处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值