想要编译本机Android二进制文件我可以在手机终端上运行

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

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

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

更新:

我终于在Mac OS X上使用GCC 4.7.0了解它。我下载了Bionic标头,然后使用Android NDK附带的C库编译了一个动态链接的二进制文件。 我能够使用手机的C lib(二进制为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。

  • 使用gcc的C ++前端编译C代码的好处
  • Android NDK使用哪个编译器?
  • 如何从已编译的二进制文件中删除字符串(.so)
  • 如何为Android编译GCC?
  • Android NDK的最新C ++ 11function
  • 如何在Android NDK项目中使用预编译头文件?
  • 用ARM的newlib交叉编译GCC:如何指定像-march这样的GCC选项?
  • 用clang而不是gcc构buildandroid? 和铛stl lib而不是gnustl lib?
  • 只需使用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 

    首先,确保你有NDK:

    http://developer.android.com/tools/sdk/ndk/index.html

    这是为手机编译C二进制文件的最简单方法:

    http://developer.android.com/tools/sdk/ndk/index.html

    http://www.kandroid.org/ndk/docs/STANDALONE-TOOLCHAIN.html

    通常$ NDK(可能不同)=

    Linux的:

    / home / / android-ndk

    Mac OS X:

    / Users / / android-ndk

    在终端:

     # create tool-chain - one line # New method in ndk 12. $NDK/build/tools/make_standalone_toolchain.py --arch arm --install-dir=/tmp/my-android-toolchain # Old method. #$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=/tmp/my-android-toolchain # add to terminal PATH variable export PATH=/tmp/my-android-toolchain/bin:$PATH # make alias CC be the new gcc binary export CC=arm-linux-androideabi-gcc # compile your C code(I tried hello world) $CC -o foo.o -c foo.c # push binary to phone adb push foo.o /data/local/tmp # execute binary adb /data/local/tmp/foo.o 

    将CMake与Android NDK结合使用是编译Android控制台应用程序的好方法。

    下载CMake和android-cmake ( 像这样设置)。 如果您的程序名为main.c,则在文件CMakeLists.txt写入以下内容:

     project(test) cmake_minimum_required(VERSION 2.8) add_executable(test ./main.c) 

    并运行cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN .

    然后,您将拥有一个Makefile用于您的程序,您可以运行make来让您的test可执行文件。

    如果agcc包装器可以帮助您在Android-tricks博客中引用,请尝试。 根据你想要使用仿生库的博客文章,但是已经安装在手机上的那个 ,而不是一些单独编译的版本。