android - 想编译原生安卓二进制我可以在手机终端运行

标签 android c gcc android-ndk arm

几天来,我一直在尝试编译一个原生 ARM Android 二进制文件,该二进制文件将在我的手机上使用终端应用程序执行。我想生成与安装在手机上的标准 Posix 二进制文件(如 ls、mkdir 等)相同类型的二进制文件。我已经在 Mac OS X 下下载了 Android NDK,并且能够编译简单的 ELF 二进制文件而不会出错。但是,当我将它们转移到手机时,它们总是出现段错误。也就是说,在 GCC 中使用 -static 编译时会出现段错误。如果我不使用 -static,他们会提示没有被链接,等等。简单地说,他们不工作。

我的假设是它们没有正确链接到 Android 标准 C 库。即使我将我的二进制文件与 NDK 提供的 libc 链接起来,它们仍然不起作用。我读到 Android 使用 Bionic C 库,并试图下载它的源代码,但我不确定如何从中构建一个库(似乎都是 ARM 程序集)。

手机上的Android C库和Android NDK提供的库是不是不一样? NDK 中包含的那个是否不允许我编译可以通过终端执行的 native 二进制文件?非常感谢这里的任何指导!

更新:

我终于在 Mac OS X 上使用 GCC 4.7.0 让它工作了。我下载了 Bionic 头文件,然后使用 Android NDK 附带的 C 库编译了一个动态链接的二进制文件。我能够使用手机的 C 库(二进制文件为 33K)让测试应用程序在手机上运行。我还尝试静态链接到 NDK 的 C 库,这也有效。

为了让这一切正常工作,我必须将 -nostdlib 传递给 GCC,然后手动将 crtbegin_dynamic.o 和 crtend_android.o 添加到 GCC 的命令行。它的工作原理是这样的:

$CC \
$NDK_PATH/usr/lib/crtbegin_dynamic.o \
hello.c -o hello \
$CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o

对于静态二进制文件,请使用“crtbegin_static.o”。这在 crtbegin_dynamic.S/crtbegin_static.S 源码中有解释。

对于这个实验,我只使用了普通的 'ol GCC 4.7.0 和 Binutils 2.22。我还用 newlib 编译了 GCC,但我实际上并没有将我的 ARM 二进制文件与 newlib 链接。我强制 GCC/ld 直接链接到 Android NDK 提供的 libc,或者在动态二进制文件的情况下,链接到手机上的 libc。

最佳答案

只需使用 android-ndk。并像这样构建一个Android.mk。 include $(BUILD_EXECUTABLE) 告诉它构建可执行文件而不是 JNI .lib

Android.mk

ifneq ($(TARGET_SIMULATOR),true)

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS += -Wall


LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -llog -g

LOCAL_C_INCLUDES := bionic
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

LOCAL_SRC_FILES:= main.cpp

LOCAL_MODULE := mycmd

include $(BUILD_EXECUTABLE)

endif  # TARGET_SIMULATOR != true

关于android - 想编译原生安卓二进制我可以在手机终端运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10798357/

相关文章:

android - 不要将项目集中在 gridview 上

c - 需要说明在 GNU C 中使用 settimer 和 alarm 函数的程序

c++ - 带有 rtkaio 的 linux 上的 aio_write 有时很长

将数组的一部分复制到自身?

c++ - unique_ptr、nullptr 并支持 gcc 4.5.x 和 4.6.x

C++11 gcc 4.9.2 算法 partition_copy() 导致 SIGABRT,与 back_inserter 一起工作

c# - UDP 代码故障排除

java - 如何将 View 放置在屏幕上的任意位置?

android - TextView 下方可绘制的线条未显示

c - GCC: 'multiple definition' gcc 4.8 版本问题