如何使用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在后台将其作为常规可执行文件运行
编译环境: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
有什么问题吗?谢谢!但是,你能帮我去联合国吗