zoukankan      html  css  js  c++  java
  • 为ARM安卓设备交叉编译C/C++语言程序

    最近调试安卓上的 ARM 程序,涉及到一些 C 语言内容。为了方便调试,看看打印啥的,希望能自己写个简单的C程序,在本地(Ubuntu主机)交叉编译后传到手机上运行,看结果。

    为了实现交叉编译,需要 Google 官方的NDK(Native Development Kit)。使用 NDK 提供的编译器进行编译,然后通过 adb 上传到手机运行。

    具体做法如下:

    1、安装 Android Studio

    网上有很多帖子介绍安装方法,Android studio官网也有安装方法介绍。这里简单说一下 Ubuntu 18.04 (64 bit) 上的安装过程。

    • 安装依赖库:
    sudo apt update
    sudo apt install openjdk-8-jdk # Must be openjdk 8
    java -version # Check java version
    sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386 # For 64-bit Ubuntu
    
    • 下载 Android Studio:去官网下载, 得到压缩文件(.tar.gz)。

    • 将文件解压合适目录:例如:全局安装可解压到/opt/目录下。给自己安装可解压到/usr/local//home/YourName/

    sudo tar xzvf android-studio-ide-xxx.xxxxx-linux.tar.gz -C /opt/
    
    • 运行安装脚本(会启动图形界面)
    /opt/android-studio/bin/studio.sh
    
    • 按照提示进行操作
    • 最后安装的目录和解压目录不同,可能是~/Android/Sdk目录下。

    2、安装 NDK

    可参考官网介绍。安装好 Android Studio 后,同样通过以下命令启动 Android Studio:

    /opt/android-studio/bin/studio.sh
    

    注意第一次启动要先建立一个 Android 项目。这个按照提示建立一个空的项目即可,后面不会用到这个项目。

    打开任意项目后(例如刚才新建的空项目),进入主界面。上方菜单选择:Tools > SDK Manager

    在打开的窗口的右上方,选择SDK Tools标签。复选框中选择NDK (Side by side)CMake,然后点OK

    后续按照提示操作即可安装。假设安装 NDK 的目录为$NDK_DIR

    Image of SDK Manager

    3、编写C程序并编译

    用任意编辑器编写一个简单的C语言程序,例如 hello_world.c

    #include <stdio.h>
    
    int main()
    {
        printf("Hello, world!");
        return 0;
    }
    

    如果是以前的版本,需要生成工具链:

    $NDK_DIR/build/tools/make_standalone_toolchain.py --arch arm --api 21 --install-dir ./toolchain
    

    参数中指定了目标平台(arm)、API水平(21)和生成目录。生成的工具链位于./toolchain目录下。

    不过现在新版本已经不需要这样了。可以直接使用$NDK_DIR/toolchains/llvm/prebuilt/linux-x86_64/bin目录下的工具链。

    然后使用生成的或者新版本预编译好的工具链进行编译。

    $NDK_DIR/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android21-clang hello_world.c -o hello_world_arm
    

    然后得到可执行文件 hello_world_arm

    4、传送到设备并运行

    将Android设备(如手机)通过USB或局域网连接主机。将编译好的可执行文件通过adb上传到设备,然后用adb shell命令行运行。假设主机和手机已经建立了adb连接,命令行中执行:

    adb push ./hello_world_arm /data/local/tmp
    adb shell
    

    接下来在adb shell中执行:

    cd /data/local/tmp
    ./hello_world_arm
    

    就可以看到打印出Hello, world!了。

    参考资料

  • 相关阅读:
    UML——六大关系整理
    C#编写Windows 服务
    Centos7下lamp环境搭建的小笔记
    awk命令分析日志的简单笔记
    ssrf小记
    关于cookie的一些学习笔记
    xssbypass小记
    xss挑战赛小记 0x03(xssgame)
    xss挑战赛小记 0x01(xsstest)
    ubuntu下安装LAMP环境遇到的一些小问题
  • 原文地址:https://www.cnblogs.com/xia-weiwen/p/13720864.html
Copyright © 2011-2022 走看看