如何使用NDK为Android设备(ARM)编译C代码?

如何使用NDK为Android设备(ARM)编译C代码?,c,android-ndk,C,Android Ndk,我需要执行以下步骤: 编写一个简单的计数器,在C/C中溢出后不断重置自身++ 通过ADB编译并将代码输入手机 通过ADB shell在后台将其作为常规可执行文件运行 如何使用NDK工具链编译上述C代码?我发现了几个类似的链接,但没有一个给出简单完整的步骤 如果有完整步骤的链接,请务必让我参考相同的链接 编译环境:Ubuntu,编译应该通过控制台完成,而不是任何IDE。你是对的,我犯了一个错误,我甚至没有测试它,给了我 I use gcc4.8 and android API-level18

我需要执行以下步骤:

  • 编写一个简单的计数器,在C/C中溢出后不断重置自身++
  • 通过ADB编译并将代码输入手机
  • 通过ADB shell在后台将其作为常规可执行文件运行
如何使用NDK工具链编译上述C代码?我发现了几个类似的链接,但没有一个给出简单完整的步骤

如果有完整步骤的链接,请务必让我参考相同的链接


编译环境:Ubuntu,编译应该通过控制台完成,而不是任何IDE。你是对的,我犯了一个错误,我甚至没有测试它,给了我
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
同样的错误,是由于“main”的入口点引起的,因为这并没有发生 改变了,但我希望这对你有用。无论如何,请检查符号表“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
#包括
int main(int argc,char*argv[])
{
printf(“你好世界”);
返回0;
}
导出NDK\u根=您的NDK\u路径
导出路径=$NDK_ROOT/toolschains/arm-linux-androideabi-4.8/prebuild/linux-x86/bin:$PATH
export CC=arm linux androideabi gcc
export-LD=arm-linux和androideabi-LD
arm linux AndroidABI gcc-I$NDK_ROOT/platforms/android-18/arch arm/usr/include-Wl,-rpath link=$NDK_ROOT/platforms/android-18/arch arm/lib-Wl,-L$NDK_ROOT/platforms/android-18/arch arm/usr/lib-Wl,--lc-o test.c
如果ld返回错误,如“…ld:错误:无法打开…:没有这样的文件或目录”
请为丢失的文件尝试以下操作:
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

你说得对,我犯了一个错误,我甚至没有测试它并给我 同样的错误,是由于“main”的入口点引起的,因为这并没有发生 改变了,但我希望这对你有用。无论如何,请检查符号表“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
#包括
int main(int argc,char*argv[])
{
printf(“你好世界”);
返回0;
}
导出NDK\u根=您的NDK\u路径
导出路径=$NDK_ROOT/toolschains/arm-linux-androideabi-4.8/prebuild/linux-x86/bin:$PATH
export CC=arm linux androideabi gcc
export-LD=arm-linux和androideabi-LD
arm linux AndroidABI gcc-I$NDK_ROOT/platforms/android-18/arch arm/usr/include-Wl,-rpath link=$NDK_ROOT/platforms/android-18/arch arm/lib-Wl,-L$NDK_ROOT/platforms/android-18/arch arm/usr/lib-Wl,--lc-o test.c
如果ld返回错误,如“…ld:错误:无法打开…:没有这样的文件或目录”
请为丢失的文件尝试以下操作:
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

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

编译应用程序时,编译器会放置所有定义的符号 在被称为符号表的东西中,问题不是链接到rtbegin_dynamic.o, crtend_android.o如果指定-nostlib选项,程序将被创建,但没有工作(表Simbol empty) nm(列出对象文件中的符号)例如:nm测试

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

LDFLAGS:是链接器的标志

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

不管怎样,如果您是新的编译,即使是交叉编译 建议您使用Android.mk方式
对不起我的英语;)

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

编译应用程序时,编译器会放置所有定义的符号 在被称为符号表的东西中,问题不是链接到rtbegin_dynamic.o, crtend_android.o如果指定-nostlib选项,程序将被创建,但没有工作(表Simbol empty) nm(列出对象文件中的符号)例如:nm测试

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

LDFLAGS:是链接器的标志

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

不管怎样,如果您是新的编译,即使是交叉编译 建议您使用Android.mk方式 对不起我的英语;)

导出路径=路径\u到\u ndk\u根:$PATH

导出NDK_项目路径=

ndk build APP_build_SCRIPT=Android.mk

导出路径=路径\u到\u ndk\u根:$PATH

导出NDK_项目路径=


ndk build APP_build_SCRIPT=Android.mk

您好,您能解释一下CFLAGS和LDFLAGS吗..编译失败..如果我包括..,因为它没有从平台/获取头文件../。。。文件夹,而是在…/toolchain…/include fixed/stdio.h中找到一个,它进一步包括一个未找到的头文件。另外,如果我不包括任何文件并编写一个简单的主函数,它可以编译,但在android上执行时会出现分段错误..I get
test.c:1:19:致命错误:stdio.h:没有这样的文件或目录#include
有什么问题吗?嗨,你能解释一下CFLAGS和LDFLAGS吗..编译失败..如果我包含..因为它没有从平台/获取头文件。。。文件夹,而是在…/toolchain…/include fixed/stdio.h中找到一个,它进一步包括一个未找到的头文件。另外,如果我不包括任何文件并编写一个简单的主函数,它可以编译,但在android上执行时会出现分段错误..我得到
test.c:1:19:致命错误:stdio.h:没有这样的文件或目录#include
有什么问题吗?谢谢!但是,你能帮我去联合国吗