android可执行文件交叉编译和运行

简介

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"
  • 1
  • 2

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

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

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

编译

$ANDROID_GCC -o output input.c
  • 1

运行

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

adb push output /data/local/tmp/
adb shell
cd /data/local/tmp
./output

你可能感兴趣的:(cmake)