我需要执行以下步骤:如何使用Android设备(ARM)的NDK编译C代码?
- 写一个简单的计数器,它一直在C/C++
- 编译溢出后重置本身并推送这个代码进入手机通过ADB
- 来看,它作为在后台通过ADB外壳定期执行
如何使用NDK工具链编译上述C代码?我发现了几个类似的链接,但他们都没有提供简单而完整的步骤。
如果有完整的步骤的链接请做参考我相同的。
编译环境:Ubuntu的,应该编译通过控制台没有任何IDE进行
我需要执行以下步骤:如何使用Android设备(ARM)的NDK编译C代码?
如何使用NDK工具链编译上述C代码?我发现了几个类似的链接,但他们都没有提供简单而完整的步骤。
如果有完整的步骤的链接请做参考我相同的。
编译环境:Ubuntu的,应该编译通过控制台没有任何IDE进行
你说得对,我犯了一个错误,我什至没有测试过,并给了我 同样的错误,是由于“主”的入口点,因为这没有 改变,但我希望这对你有用。无论如何检查符号表“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
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
嗨,你能解释一下CFLAGS和LDFLAGS..the编译fails..if我包括
我得到'test.c:1:19:致命错误:stdio.h:没有这样的文件或目录 #include
gdbserver的是调试运行Android设备上的应用,并且可以从PC 控制GDB使用TCP连接。 gdb(GNU调试器) 需要调试符号。
当你编译应用程序编译器把定义的东西称为符号表 所有符号,这个问题并没有链接到rtbegin_dynamic.o, crtend_android.o,如果你指定-nostdlib选项创建方案,但没有工作(表辛博尔空) 纳米(从目标文件列表的符号),如:纳米测试
GCC是不是一个编译器,它是控制的是其他应用程序是什么使工作 为执行 司机示例尝试invoque编译器使用 - ###作为唯一选项以查看详细信息
LDFLAGS:是国旗的链接
CFLAGS:是一个标志编译器(不是链接)
无论如何,如果你是新来的编辑,甚至在交强编译 建议您使用Android .mk方式 对不起,我的英语;)
感谢您的回复,我是不是新的编译,但是在Android设备上工作较少..并且,我不明白这部分..“问题不是链接到rtbegin_dynamic.o,crtend_android.o,如果您指定-nostdlib选项程序创建但是没有工作(Table Simbol empty)nm(从目标文件中列出符号)例如:nm test“ –
也可以理解,”invoque编译器使用 - ###作为唯一选项以查看详细信息“ –
从man gcc: - # ## 与-v一样,除非命令未执行且参数被引用,除非它们仅包含字母数字字符或“./-_”。这对于shell脚本来捕获驱动程序生成的命令行很有用。 –
#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
谢谢!但是,请你帮我理解一下“无论如何检查符号表”nm“,即时执行”strace“,你甚至可以使用gdbserver。”我之前没有用过这些东西 –
感谢您的答案,但是没有正确的方法来解决这些链接: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它在运行时? –
那么在使用bash的UNIX环境中,假设NDK_ROOT是一个变量,$ NDK_ROOT访问它的值,我不知道为什么这不适合你。 -Wl将向编译器指定“下一个选项”用于链接器。 –