简介

android一般使用java进行开发,但是有时候我们可能需要使用到native语言,使用C/C++进行编译运行. 现在我们可以搜到很多使用android-studio和NDK进行编译so运行的方式,我就不再赘述了,我们这里主要讲如何利用已经有的NDK工具链,直接进行编译可执行文件和运行的方法

具体方法

系统环境

我使用的kali linux,可以认为是debian 8系统.
如果是windows可以使用cygwin.

编译工具链

如果你有NDK,在/Sdk/ndk-bundle/目录下,那么可以不用下载交叉编译工具链,否则你需要手动安装工具链,网上有很多方法,这里不再赘述. 建议通过android sdk manager下载ndk,这样既可以用于so的编译,也可以提取出具体工具链进行编译.

更改环境变量

如果你的目录比较冗长,那么没有必要每一次都手动去指定工具,我们选择更改环境变量的方式.
在~/.bashrc文件末尾添加:

export SYSROOT="$NDK/platforms/android-24/arch-arm"export ANDROID_GCC="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT -pie -fPIE"

$NDK为你的ndk安装目录,可能名为ndk-bundle.
SYSROOT为交叉编译时所需要的一些include文件等的目录,需要在编译时手动指定,因为我们不能使用pc电脑的include文件
-pie 和 -fPIE为指定用地址无关代码方式来编译文件,因为在android 4.4之后加入了保护,如果没有这个选项,android会拒绝运行,出现以下错误

error: only position independent executables (PIE) are supported.

关于版本,里面的数字基本就是版本,可以根据你手里的具体情况进行更改,重点为找到这个类似目录下的相应版本的文件(如arm-linux-androideabi-gcc)

编译

$ANDROID_GCC -o output input.c

运行

由于android的一些权限机制,位于sdcard和sdcard1的目录默认都是不可运行的,也就是说,如果adb push到这两个目录下还是会出现没有权限运行. /data/目录是可以运行的,可是不能直接放在这个目录下,因为没有权限直接放在这个目录. 所以我们的方法是放到/data/local/tmp/目录 这个目录下的文件可以运行,且可以通过adb push放进去

adb push output /data/local/tmp/adb shellcd /data/local/tmp./output

更多相关文章

  1. Android从零开始(一)
  2. Android引用多个平台so库,冲突的问题
  3. 八、使用pull解析器操作xml文件
  4. Android图表之-Echarts
  5. Android的几个常见小错误ZZ
  6. Android开发需要掌握的10个工具
  7. android 资源管理相关分析(基于android-24)
  8. android studio生成aar包并在其他工程引用aar包
  9. Android交互式视觉设计简介

随机推荐

  1. php面向对象之抽象类和接口理解
  2. Thinkphp 使用原生类
  3. 如果db query A没有返回足够的结果,请运行
  4. PHP基础之脚本传参
  5. 如何解决一段时间真正的循环,因为它昂贵且
  6. PHP强大包括处理错误?
  7. Laravel将动态输入数据数组保存到数据库
  8. 在rhel5版本下安装mysql+apache+php实战
  9. 在单个测试中断言多个条件,还是分成多个测
  10. 在PHP中如何取得两个日期时间相减的结果,