2013-12-13 91 views
1

我需要执行以下步骤:如何使用Android设备(ARM)的NDK编译C代码?

  • 写一个简单的计数器,它一直在C/C++
  • 编译溢出后重置本身并推送这个代码进入手机通过ADB
  • 来看,它作为在后台通过ADB外壳定期​​执行

如何使用NDK工具链编译上述C代码?我发现了几个类似的链接,但他们都没有提供简单而完整的步骤。

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

编译环境:Ubuntu的,应该编译通过控制台没有任何IDE进行

回答

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 
+0

谢谢!但是,请你帮我理解一下“无论如何检查符号表”nm“,即时执行”strace“,你甚至可以使用gdbserver。”我之前没有用过这些东西 –

+0

感谢您的答案,但是没有正确的方法来解决这些链接: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 ..我们不需要-Wl,-rpath-link = $ NDK_ROOT/platforms/android-18 /拱臂/ usr/lib..is它在运行时? –

+0

那么在使用bash的UNIX环境中,假设NDK_ROOT是一个变量,$ NDK_ROOT访问它的值,我不知道为什么这不适合你。 -Wl将向编译器指定“下一个选项”用于链接器。 –

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 
+0

嗨,你能解释一下CFLAGS和LDFLAGS..the编译fails..if我包括 ..as它不从获取平台/头。 。/ ...文件夹,而是在.../toolchain中找到一个.../include-fixed/stdio.h,其中还包含未找到的头文件。另外,如果我不包含任何文件并编写一个简单的主要功能,它会编译但在android上执行时会给出分段错误。 –

+0

我得到'test.c:1:19:致命错误:stdio.h:没有这样的文件或目录 #include '这是什么问题? – lukassz

1

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

当你编译应用程序编译器把定义的东西称为符号表 所有符号,这个问题并没有链接到rtbegin_dynamic.o, crtend_android.o,如果你指定-nostdlib选项创建方案,但没有工作(表辛博尔空) 纳米(从目标文件列表的符号),如:纳米测试

GCC是不是一个编译器,它是控制的是其他应用程序是什么使工作 为执行 司机示例尝试invoque编译器使用 - ###作为唯一选项以查看详细信息

LDFLAGS:是国旗的链接

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

无论如何,如果你是新来的编辑,甚至在交强编译 建议您使用Android .mk方式 对不起,我的英语;)

+0

感谢您的回复,我是不是新的编译,但是在Android设备上工作较少..并且,我不明白这部分..“问题不是链接到rtbegin_dynamic.o,crtend_android.o,如果您指定-nostdlib选项程序创建但是没有工作(Table Simbol empty)nm(从目标文件中列出符号)例如:nm test“ –

+0

也可以理解,”invoque编译器使用 - ###作为唯一选项以查看详细信息“ –

+0

从man gcc: - # ## 与-v一样,除非命令未执行且参数被引用,除非它们仅包含字母数字字符或“./-_”。这对于s​​hell脚本来捕获驱动程序生成的命令行很有用。 –

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) 

出口PATH = path_to_ndk_root:$ PATH

出口NDK_PROJECT_PATH =。

NDK-建立APP_BUILD_SCRIPT = Android.mk