【发布时间】: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 中提到的那样