android.mk编译STL,Android.mk编译带c++ stl的程序

众所周知,Android系统是基于Linux系统的构建的,习惯Linux开发的伙伴们都知道,写Linux程序一般有三种情况:

(1)如果你的程序只有一个文件(一般都是一些测试验证程序),那么只需要gcc xxx.c -o xxx就可以了;

(2)如果你的工程包含不止一个源文件,那么就需要一个漂亮的Makefile来指定自己的编译器,头文件目录,依赖库吗,源文件等;

(3)做过实际产品的人应该知道,一个产品往往只有一个交叉编译工具链,但是有众多的工程,kernel,文件系统,各种应用程序。这个时候,我们的工程管理就会复杂一些了,我们一般会用一个总的Makefile加一系列的xxx.mk文件来对整个产品的多个工程进行管理,最后实现只要一个make或者make all命令就可以编译全部工程!而使用不同的参数,则可以分别单独编译任意一个子工程。

好了,AOSP(Android开放源码工程)实际上就是上面的第三种情况,它是一个大工程,其下有非常多的子工程,包括kernel、文件系统、framework、Dalvik等等。Android的做法也是用一个Makefile然后再加一系列xxx.mk的方式构建了自己的一套编译系统!其实跟我们做法是一样的,只不过Android做的更完善罢了。下载好AOSP的源码后,只要在顶层目录一个make all命令即可把Android系统全部编译!

如果是我们自己开发的一个c/c++程序如何编译到Android系统呢?方法有两种:

(1)找到AOSP使用的交叉编译器,直接在你的Makefile里面指定,这当然行的通,但做法并不正规,有走后门的嫌疑;

(2)使用Android规范的Android.mk进行编译,Android.mk跟我们平常写的xxx.mk一样,本身并不是完整的Makefile,只是一些局部变量的设置,这些局部变量即:编译所需的源文件、头文件目录、依赖库以及目标文件名称等。

以上两种方式编译出来的二进制文件,可以直接运行在Android系统上,而且就算Dalvik不启动,这些程序也照样可以运行,因为他们跟Dalvik是同一层次的东西,都是c/c++交叉编译器直接编译出来的。这也打了很多人说c/c++无法开发Android或者必须使用JNI方式来开发的观点;

用自己的Makefile编译Android程序的,可以自己看看AOSP的编译系统,找到其交叉编译器,我试过,是可以的。

下面用一个例子来说明Android.mk的用法:

因为使用了c++ stl模板的程序不太好编译过,所以下面程序变用了stl,并且我们把可执行文件拷贝了一份到/data目录下:

Android.mk代码:

LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)C_SRC:=$(wildcard$(LOCAL_PATH)/*.cpp)C_SRC:=$(C_SRC:$(LOCAL_PATH)/%=%)$(warning"C_SRCis:"$(C_SRC))LOCAL_SRC_FILES:=$(C_SRC)LOCAL_C_INCLUDES :=prebuilts/ndk/9/sources/cxx-stl/stlport/stlportLOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog \prebuilts/ndk/9/sources/cxx-stl/stlport/libs/x86/libstlport_static.aLOCAL_MODULE:=helloVectorLOCAL_MODULE_OWNER:=zhanghwLOCAL_MODULE_TAGS:=optionalLOCAL_MODULE_PATH:=$(TARGET_OUT_DATA)/system/bin$(shellmkdir-p$(TARGET_OUT_DATA)/data)include$(BUILD_EXECUTABLE)

c++源码:

#include

#include

using namespace std;

int main(int argc,char ** argv)

{

vector tab;

tab.push_back(100);

tab.push_back(101);

tab.push_back(102);

for(int i=0;i<3;i++){

printf("%d ",tab[i]);

}

printf("\n");

return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值