前面2篇文章分别介绍了Android NDK编译的命令行参数,以及如何在任意目录使用Android.mk来编译本地c/c++代码,Andriod.mk和ndk-build只不过是Android官方提供了一套封装过的Android交叉编译环境而已,其实,你可以不用它,而直接通过传统的Makefile文件来编译你的c/c++代码的,本文即介绍如何直接通过传统的Makefile文件来编译可用于Android平台的库文件


经常搞嵌入式开发的朋友对于交叉编译环境应该并不陌生,说白了,就是一组运行在x86 PC机的编译工具,可以让你在PC机上编译出目标平台(例如ARM)可识别的二进制文件。Android平台也提供了这样的交叉编译工具链,就放在Android的NDK开发包的toolchains目录下,因此,我们的Makefile文件中,只需给出相应的编译工具即可。


废话就先说到这,直接上例子,我们目标是把下面这个math.c文件编译成一个静态库文件


#include<stdio.h>intadd(inta,intb){returna+b;}


你需要编写一个Makefile文件,这里假设你的Android ndk被安装在/opt/android/ndk目录下,当然,你可以根据自己的实际情况修改Makefile中相关路径的定义,Makefile文件示例如下


#MakefileWrittenbyticktick#Showhowtocross-compilec/c++codeforandroidplatform.PHONY:cleanNDKROOT=/opt/android/ndkPLATFORM=$(NDKROOT)/platforms/android-14/arch-armCROSS_COMPILE=$(NDKROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-CC=$(CROSS_COMPILE)gccAR=$(CROSS_COMPILE)arLD=$(CROSS_COMPILE)ldCFLAGS=-I$(PWD)-I$(PLATFORM)/usr/include-Wall-O2-fPIC-DANDROID-DHAVE_PTHREAD-mfpu=neon-mfloat-abi=softfpLDFLAGS=TARGET=libmath.aSRCS=$(wildcard*.c)OBJS=$(SRCS:.c=.o)all:$(OBJS)$(AR)-rc$(TARGET)$(OBJS)clean:rm-f*.o*.a*.so

这里不讲Makefile文件的基本原理,只说明一下针对Android环境的Makefile文件编写的注意事项。


(1) CROSS_COMPILE


必须正确给出Android NDK编译工具链的路径,当在目录中执行make命令的时候,编译系统会根据 CROSS_COMPILE 前缀寻找对应的编译命令。


(2) -I$(PLATFORM)/usr/include


由于Android平台没有使用传统的c语言库libc,而是自己编写了一套更加高效更适合嵌入式平台的c语言库,所以系统头文件目录不能再使用默认的路径,必须直到Android平台的头文件目录


(3) -Wall -O2 -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp


这些参数的意义网上基本上都有介绍,我就不一一解释了,并不都是必须添加的,但比较常用。


编译方法:


写好makefile文件,并且保存之后,就可以直接在当前目录下执行make命令,编译完成后,当前目录下会生成 libmath.a ,即可直接拿到Android的jni工程中和使用了。


关于如何直接使用Makefile文件交叉编译Android平台的c/c++代码就介绍到这里了,有任何疑问欢迎留言或者来信lujun.hust@gmail.com交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。


更多相关文章

  1. 第一个Android程序
  2. Android开发---xml布局文件中的常见属性总结
  3. 64位 ubuntu android SDK 无法新建AVD,adb 没有那个文件或目录的
  4. Android(安卓)Studio 中关于NDK编译及jni header生成的问题
  5. 在Ubuntu7.10上编译android
  6. android差分更新之服务端
  7. windows android apk,framework 解包,打包
  8. Android(安卓)手机卡了怎么办
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android Fresco - SimpleDraweeView 圆形
  2. Android字体
  3. Android中ListView的使用
  4. Android工具包AndroidUtils
  5. android.intent.action.MAIN与android.in
  6. 前台android与后台Servlet交互---上传文
  7. Android自动弹出软键盘(输入键盘)
  8. ANDROID GreenDao 使用例子 Android Gree
  9. 谷歌Android系统版本无序发展反噬产业链
  10. linux android 下进入android shell