如何使用NDK for Android Device(ARM)编译C代码?

时间:2013-12-13 04:45:29

标签: c android-ndk

我需要执行以下步骤:

  • 编写一个简单的计数器,在C / C ++中溢出后不断重置自身
  • 通过ADB编译并将该代码推送到手机
  • 通过ADB shell在后台运行它作为常规可执行文件

如何使用NDK工具链编译上面的C代码?我找到了几个类似的链接,但没有一个给出简单而完整的步骤。

如果有完整步骤的链接,请参考我的相同内容。

编译环境:Ubuntu,编译应该通过控制台完成而不是任何IDE

4 个答案:

答案 0 :(得分:2)

你是对的,我犯了一个错误,我甚至没有测试它并给了我 相同的错误,是由于“主”的入口点,因为这没有 改变但我希望这适合你。无论如何检查符号表“nm”, 实时执行“strace”,你甚至可以使用gdbserver。

#include <stdio.h>
int main (int argc, char *argv[])
{
        printf ("hello world");
        return 0;
}


export NDK_ROOT=your_ndk_path
export PATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin:$PATH
export CC=arm-linux-androideabi-gcc
export LD=arm-linux-androideabi-ld
arm-linux-androideabi-gcc -I$NDK_ROOT/platforms/android-18/arch-arm/usr/include -Wl,-rpath-link=$NDK_ROOT/platforms/android-18/arch-arm/usr/lib -Wl,-L$NDK_ROOT/platforms/android-18/arch-arm/usr/lib -Wl,-lc -o test test.c

If ld return with erros like "... ld: error: cannot open... : No such file or directory"
try this for your losed files:
ln -s $NDK_ROOT/platforms/android-18/arch-arm/usr/lib/crtend_android.o
ln -s $NDK_ROOT/platforms/android-18/arch-arm/usr/lib/crtbegin_dynamic.o

答案 1 :(得分:1)

I use gcc4.8 and android API-level18
usin this you can try:

First way using command line.
export NDK_ROOT=your_ndk_path
export PATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin:$PATH
export CC=arm-linux-androideabi-gcc
export LD=arm-linux-androideabi-ld
export CPPFLAGS=-I$NDK_ROOT/platforms/android-18/arch-arm/usr/include
export CFLAGS="-nostdlib" LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-18/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-18/arch-arm/usr/lib"
export LIBS="-lc"
arm-linux-androideabi-gcc  -nostdlib -o test test.c

If run "file test" you should see this:
test: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped


Second way using autotools.
export PATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin:$PATH
./configure --host=arm-linux-androideabi CC=arm-linux-androideabi-gcc LD=arm-linux-androideabi-ld CPPFLAGS="-I$NDK_ROOT/platforms/android-18/arch-arm/usr/include" CFLAGS="-nostdlib" LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-18/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-18/arch-arm/usr/lib" LIBS="-lc"
make
http://embelinux.blogspot.com/2013/09/autotools1-hola-mundo-la-autotools.html


Third way using android developers ndk full feature.
Read Android.mk file syntax specification. This document describes the
syntax of Android.mk build file written to describe your C and C++ source
files to the Android NDK.
http://www.kandroid.org/ndk/docs/ANDROID-MK.html

答案 2 :(得分:1)

gdbserver是调试Android设备上运行的应用程序而且可以 使用TCP连接从PC控制gdb。 gdb(GNU调试器) 需要调试符号。

编译应用程序时,编译器会定义所有符号 在称为符号表的东西中,问题没有链接到rtbegin_dynamic.o, crtend_android.o如果你指定了-nostdlib选项,那么程序就会被创建但是没有工作(Table Simbol为空) nm(列出目标文件中的符号)例如:nm test

gcc不是编译器,它是控制执行的驱动程序 其他应用程序是什么使这项工作 例如,尝试使用 - ###作为唯一选项调用编译器以查看详细信息

LDFLAGS:是链接器的标志

CFLAGS:是编译器的标志(不是链接)

无论如何,如果您不熟悉编译,即使是强烈交叉编译也是如此 建议您使用Android.mk方式 抱歉我的英文;)

答案 3 :(得分:1)

#Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) 
#module name
LOCAL_MODULE    := test  
#src
LOCAL_SRC_FILES := test.c
#build executable
include $(BUILD_EXECUTABLE)

export PATH = path_to_ndk_root:$ PATH

导出NDK_PROJECT_PATH =。

ndk-build APP_BUILD_SCRIPT = Android.mk