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.ocrtend_android.o

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

更多相关文章

  1. 【Android】windows系统上安装与使用Android(安卓)NDK r5
  2. Android(安卓)开发 调用图库选择图片实现和参数详解
  3. android 自定义控件学习之三 控件布局常用知识总结
  4. Android(安卓)Zip文件解压缩代码
  5. 跨平台编译的经验之谈--cmake编译Android之ndk-build
  6. Android(安卓)NDK编程中Application.mk和Android.mk写法
  7. 在Android(安卓)9 中移植自己的app,用到automove 中Car service和
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. android listview 调用sqlsite数据库显示
  2. Android(安卓)drivers to be included in
  3. Android(安卓)Out of Memory Error: Caus
  4. Android(安卓)播放音乐文件与视频文
  5. android的listactivity实例
  6. Android开发环境搭建
  7. Android解决ImageView setRotation....等
  8. Android(安卓)issues
  9. Android(安卓)Path的使用
  10. Android重启应用程序代码