我已经尝试了几天来编译一个本机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中的那个不允许我编译我可以通过终端执行的本机二进制文件吗?非常感谢任何指导!
更新
我终于在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 source。
中有解释对于这个实验,我只使用普通的'ol GCC 4.7.0和Binutils 2.22。我还使用newlib编译了GCC,但我实际上并没有将我的ARM二进制文件与newlib链接起来。我强迫GCC / ld直接链接到Android NDK提供的libc,或者动态二进制文件链接到手机上的libc。
答案 0 :(得分:20)
只需使用android-ndk。并像这样构建一个Android.mk。
include $(BUILD_EXECUTABLE)
告诉它构建可执行文件而不是JNI .lib
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
答案 1 :(得分:16)
首先,确保你有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的:强>
/家庭/ <user>
/机器人-NDK
Mac OS X:
/用户/ <user>
/机器人-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
答案 2 :(得分:3)
在Android NDK中使用CMake是一种编译Android控制台应用程序的好方法。
下载CMake和android-cmake(设置like this)。如果您的程序名为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
可执行文件。
答案 3 :(得分:0)
如果agcc wrapper可以帮助您Android-tricks博客中引用,请尝试。根据博客文章你想使用仿生库,但是那个已经安装在手机上,而不是一些单独编译的版本。