Android NDK编译hello world真机运行

来源:互联网 发布:换发型的软件 编辑:程序博客网 时间:2024/06/05 23:51

本文转载随意 ^_^

  • 使用NDK生成独立的交叉工具链
  • Linux下环境配置及编译
  • 测试运行

一、使用NDK生成独立的交叉工具链

首先需要从NDK包中获取独立的编译工具链,我的编译环境是Linux Mint 18,下文也是在该环境下操作的,ubuntu大同小异(建议使用最新的NDK):
cd 到你的ndk根目录,然后cd build/tools 运行以下命令

sudo ./make_standalone_toolchain.py \--arch=arm \--api=23 \--install-dir=/opt/arm-linux-androideabi参数说明:     1) --arch=arm 表示目标架构,        可选值是arm,arm64,mips,mips64,x86,x86_64         我的手机是一加X 801的CPU,属于arm-32bit,所以选arm    2)--api=23 表示API Level,现在我的手机系统是Android 6.0,API=23    3)--install-dir 后面跟着的是安装地址

二、 Linux下环境配置及编译

gedit ~/.bashrc 在文件末尾添加下面一行后,保存退出,重新打开终端,新的环境变量就可生效

export PATH=$PATH:/opt/arm-linux-androideabi/bin

编译hello.c

#include <stdio.h>int main(void){    printf("Hello World!\n");    return 0;}
arm-linux-androideabi-gcc -pie -fPIE -o hello hello.c

切勿忘记在编译选项中添加 -pie -fPIE,否则在较新版本的Android系统上是无法运行的。按照google的说法,这是为了出于安全的考虑。查看《深入Linux内核架构》进程地址空间一章中,“PM_RANDOMIZE被设置后,内核不会为栈和内存 映射的起点选择固定位置, 而是在每次新进程启动时随机改变这些值的设置。这引入一个一些复杂性,使得攻击因缓存区溢出导致的安全漏洞更加困难”。我想很有可能和PM_RANDOMIZE有关系,这里不再深入讨论。


三、测试运行

我的手机tmpfs文件系统是挂载在/mnt下的,所以先把hello这个可运行文件adb push到这个目录

adb push ./hello /mnt

然后adb shell —> su —>cd /mnt —> chmod 777 hello –> ./hello (手机需要root,当输入su的时候,手机会弹出个窗口说shell请求root,点击同意即可)

可以看到Hello World打印出来啦~


0 0
原创粉丝点击