如何使用自己的makefile编译android ndk项目 android项目里的jni中有两个makefile文件,一...

作者&投稿:宋巩 (若有异议请与网页底部的电邮联系)
其实android ndk上的编译说到底也就是交叉编译,只要配置好交叉编译工具链,使用原有的makefile也是可以编译出在android运行的c、c++程序的。以android-ndk-r4-crystax的ndk版本为例:编译器路径 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin名称前缀 arm-eabi-头文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include库文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib你可以试一下上面的配置,如果编译链接都没有问题,可以adb push到android设备上运行看看,什么结果?有点崩溃,根本运行不起来,你也许想试试看android自带的ndk例子,确实是能够运行的,问题在哪儿呢?只是正确配置了编译器、头文件、库文件还不够,还需要配置编译、链接的参数,android例子中编译链接的参数是什么呢?你也许想深究一下android的makefile,可是不久你会发现那是更崩溃的事情,里面用了很多的make脚本函数。其实android的makefile是可以把执行的详细命令输出来的,只要make的时候加上V=1即可。可以看到确实带了很多参数编译参数:-fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Wa,--noexecstack -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID 链接参数:-nostdlib -Bdynamic -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,-z,noexecstack -L$(PLATFORM_LIBRARY_DIRECTORYS) crtbegin_static.o crtend_android.o 这其中链接参数中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最关键的,android使用了自己的进程加载器,并且自定义了c运行时的启动结束。难怪先前编译的进程启动不了。

android ndk提供了一套自己的makefile管理方式,要将源码项目移植到android平台,需要按照android的makefile规则编写makefile,还要按android的规则部署源码目录,对一个有自己的makefile管理方法的大型项目来说,只是做一下makefile迁移工作就是一件很麻烦的事。
其实android ndk上的编译说到底也就是交叉编译,只要配置好交叉编译工具链,使用原有的makefile也是可以编译出在android运行的c、c++程序的。
以android-ndk-r4-crystax的ndk版本为例:
编译器路径 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
名称前缀 arm-eabi-
头文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include
库文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib
你可以试一下上面的配置,如果编译链接都没有问题,可以adb push到android设备上运行看看,什么结果?
有点崩溃,根本运行不起来,你也许想试试看android自带的ndk例子,确实是能够运行的,问题在哪儿呢?
只是正确配置了编译器、头文件、库文件还不够,还需要配置编译、链接的参数,android例子中编译链接的参数是什么呢?你也许想深究一下android的makefile,可是不久你会发现那是更崩溃的事情,里面用了很多的make脚本函数。其实android的makefile是可以把执行的详细命令输出来的,只要make的时候加上V=1即可。可以看到确实带了很多参数
编译参数:
-fpic
-mthumb-interwork
-ffunction-sections
-funwind-tables
-fstack-protector
-fno-short-enums
-Wno-psabi
-march=armv5te
-mtune=xscale
-msoft-float
-mthumb
-fomit-frame-pointer
-fno-strict-aliasing
-finline-limit=64
-Wa,--noexecstack
-D__ARM_ARCH_5__
-D__ARM_ARCH_5T__
-D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-DANDROID
链接参数:

-nostdlib
-Bdynamic
-Wl,-dynamic-linker,/system/bin/linker
-Wl,--gc-sections
-Wl,-z,nocopyreloc
-Wl,--no-undefined
-Wl,-z,noexecstack
-L$(PLATFORM_LIBRARY_DIRECTORYS)
crtbegin_static.o
crtend_android.o
这其中链接参数中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最关键的,android使用了自己的进程加载器,并且自定义了c运行时的启动结束。难怪先前编译的进程启动不了。

makefile 安卓怎么安装~

项目中需要将linux的应用程序放在android下面编译。 以前的编译用makefile,而android用android.mk 需要 linux makefile转换为android.mk , 将生成 可执行文件、静态库、动态库 的规则对应到android.mk 还有对应makefile引入的文件顺序。

ndk提供了三种编译方式,分别为编译为静态库,编译为动态库,编译为可执行文件,如果你的c/c++文件里面有main函数应该是用来在arm板子或者手机执行的,把编译模块的那个位置,使他编译为可执行文件就好了。

如何在make file 添加编译
答:将makefile复制为一个。mak文件,然后用VC打开即可! .mak 就是一个makefile 你可以指定怎样编译(命令行,必须先设置VC命令行环境) vcvars32.bat可设置环境,在vc98/bin下 nmake /f XXXX.mak 如果有一个makefile 就只要 nmake 就可以了 makefile 文件和LINUX,UNIX环境下的时一样! MSDN中有make...

[Linux]编写一个简单的C语言程序,编写Makefile文件。
答:例如使用单后缀规则.c,可以由hello.c和hello1.c生成hello和hello1文件。例如将前面的makefile改为: 图5 使用单后缀规则的makefile例 由于.c后缀规则为make标准后缀规则,make为其指定了相应的命令行,所以在makefile中可以不用再指定其目标生成的具体命令行。 下表是make提供的标准后缀规则。 表1 make标准后缀规则...

如何写一个简单的makefile
答:makefile:objects = main.o print.o #应该叫变量的声明更合适 helloworld : $(objects) //声明了变量以后使用就要$()了 gcc -o helloworld$(objects)mian.o : mian.c print.h gcc -c main.c print.o : print.c print.h gcc -c print.c clean :rm helloworld $(objects)修改完毕,...

linux中用C语言编写完模块后怎么编写makefile文件?用到什么命令?以什么...
答:然后换行后按Tab键,然后编写编译规则 make命令一般是同时编译多个文件时才使用,以下是同时编写多个独立的C文件 filename1和filename2……没有依赖关系 filename1:filename1.c gcc -o filename1 filename1.c filename2:filename2.c gcc -o filename2 filename2.c makefile编译多个需要依赖(互相...

怎样写个makefile 文件编译hello.c
答:以下是一个最简单的多文件+makefile的形式 编译采用gcc 你可以修改成你的编译器 三个文件 main.c func.c makefile main.c 1 2 3 4 5 6 7 include <stdio.h> extern void func();//这个应该放在头文件中的 比如func.h 简单起见 就直接声明了 int main(){ func();} func.c 1 2 3 ...

最近在学vim,想要知道makefile文件时怎么用的
答:或者你可以使用,make -f makefile 指定make文件,此时文件名随意了。命令格式不是一辆句话就能说清除的。去搜索:《gnu make 中文 手册》这个手册必须看。如果你对make半懂不懂,又想使用make,文件一多,就非常浪费你自己的时间。并且还容易引起链接上的bug。导致你文件更改后,没有重新编译。

什么是makefile? 如何编写makefile?
答:一个target,即最终创建的东西 一个和多个dependencies列表,通常是编译目标文件所需要的其他文件 需要执行的一系列commands,用于从指定的相关文件创建目标文件 make执行时按顺序查找名为GNUmakefile,makefile或者Makefile文件,通常,大多数人常用Makefile Makefile规则:target: dependency dependency [..] ...

如何编写makefile
答:你先用gcc把它给编译出来。然后再想用makefile gcc最一般的用法就是:gcc -o 要生成的可执行文件名 源代码文件名 如:gcc -o hello.x hello.c 如果一些头文件要指明的话,可以这样:gcc -o hello.x -I头文件所在的文件夹 -l一些库名 hello.c 最通常,我们用到一些数学库。gcc -o hello....

linux中c语言makefile
答:Makefile有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:这是简化后的Makefile main:main.o mytool1.o mytool2.o gcc -o $@ $^ main.o:main.c mytool1.h...

Windows系统下如何使用makefile
答:我这边已经注册好环境变量了,如果你没有看到,可以将vs的bin目录添加到系统环境目录的path里 重新打开DOS窗口,输入nmake,如果提示如下,则说明环境目录注册成功:这时,可以开始我们的编译了,打开DOS窗口,导航到源代码目录,执行nmake,注意nmake对应的编译为makefile(无后缀名)如果你系统里面有好几个vs...