【问题标题】:Generate ARM thumb-2 assembly code from android app for Cortex M3 architecture从 Cortex M3 架构的 android 应用程序生成 ARM thumb-2 汇编代码
【发布时间】:2022-01-10 22:22:30
【问题描述】:

我想构建一个 Android 应用程序,它将作为将 C++ 转换为 ARM Cortex M3 架构的汇编代码的接口。

我不是 android java 开发人员,我主要用 C/C++ 做 arduino 项目。因此,我需要您的帮助,为我指明如何在 Android Studio 或类似工具中使用 java 构建 android 应用程序,该应用程序能够从 C++ 源代码转换为 ASM 代码 M3 Cortex。

我做了一些研究,发现我需要使用 ARM NONE EABI GCC 编译器从 C++ 生成 ASM 代码,就像这些命令行指令一样简单:

arm-none-eabi-gcc -O2 -mthumb -c test.c -o test.o
arm-none-eabi-objdump -D test.o

我尝试使用 android Termux 应用程序构建该编译器,但失败了。我关注了许多关于如何构建 arm-none-eabi-gcc 二进制文件的帖子和文章。甚至尝试在 termux 中运行不同的类似二进制文件但总是失败,可能是因为我的智能手机设备架构是 AARCH64 并且我使用像 Termux 这样的第三方应用程序作为 linux 终端模拟器,这会导致不同类型的错误。但是我没有找到一篇关于如何使用 Termux 在 android 上安装这个 arm 编译器的好文章。

甚至打开了new question 关于如何构建这个编译器,但还没有答案。

我想,为了将 C++ 转换为 ASM(M3 Cortex),我必须使用 arm 编译器作为带有参数的命令行工具,从我的 android 应用程序执行一些 shell 命令,例如:

try{
    Process su = Runtime.getRuntime().exec("su");
    DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());

    outputStream.writeBytes("arm-none-eabi-gcc -O2 -mthumb -c test.c -o test.o");
    outputStream.flush();

    outputStream.writeBytes("exit\n");
    outputStream.flush();
    su.waitFor();
}catch(IOException e){
    throw new Exception(e);
}catch(InterruptedException e){
    throw new Exception(e);
}

我的方法是在 Android 上使用 GCC 使用 Termux 应用程序作为安装了 ARM 编译器的第三方,我可以从我的 android 应用程序中使用 termux API 调用以将 C++ 转换为 ASM,这将更容易构建我的 android应用程序。

但我不确定这是否是正确的方法,因为我是 android 应用程序开发的初学者。因此,请提供建议和示例,这些示例将为我提供实现目标的正确方法。

【问题讨论】:

  • 安卓!=Linux。 Termux 是具有类似 Linux 环境的 Android 应用程序,构建 Android 应用程序意味着该应用程序将存在于 Termux 之外。假设您使用交叉编译器获取类似 gcc 的库/可执行文件以在您的 Android 应用程序中运行,由于隐私/安全原因,输出二进制文件将仅存在于您的应用程序中,请参阅:Android Data Storage。没有可供任何 C 代码写入的控制台,所以我不明白应用程序的用途。
  • @MorrisonChang 谢谢你的评论。但是 Termux 提供了 API,我可以从我的应用程序中使用它来执行 Termux 环境中的其他应用程序。我尝试使用 Termux 安装的 GCC 编译器,它可以工作。但现在的问题是如何让 arm-none-eabi-gcc 编译器工作。我找不到要在 Termux 中运行的二进制文件,我尝试从源代码构建该编译器,但它在构建过程中会产生一些错误,所以也许对 Termux 和 Linux 更熟练的人可以告诉我如何构建它,然后我就可以了与 Termux API 一起使用以通过 shell 运行,就像我在我的 questn 中提到的那样

标签: java android linux termux


【解决方案1】:

如果在 Termux 应用程序中您将执行以下操作,则解决方案是: (more details here)

  1. pkg install proot
  2. pkg install proot-distro
  3. proot-distro install debian
  4. proot-distro login debian

之后,您应该登录到 Debian 环境,并且您可以安装 debian 存储库中几乎所有可用的 Arm 软件包。

例如,您应该能够安装这个 Cortex 编译器:

$ sudo apt-get remove binutils-arm-none-eabi gcc-arm-none-eabi
$ sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
$ sudo apt-get update
$ sudo apt-get install gcc-arm-none-eabi
$ sudo apt-get install gdb-arm-none-eabi

剩下要做的就是编写你的安卓应用,使用Termux API 它将按照您在问题中已经建议的那样传递输入并获得输出,这是正确的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多