【问题标题】:Running C program on Android在 Android 上运行 C 程序
【发布时间】:2011-12-12 07:11:09
【问题描述】:

我通过 NDK 为 Android 编译了一个简单的 C 程序,并在 Android 上运行。

C源码:

#include <stdio.h>
int
main ()
{
    printf ("Hello world!\n");
}

编译 C 源的脚本:

#!/bin/bash
PREFIX="/opt/android-ndk-r7"
CC="$PREFIX/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-arm/bin/arm-linux-androideabi-gcc"
NDK="$PREFIX/platforms/android-14/arch-arm"
CFLAGS="-I$NDK/usr/include"
LDFLAGS="-nostdlib -Wl,-rpath-link=$NDK/usr/lib -L$NDK/usr/lib $NDK/usr/lib/crtbegin_dynamic.o -lc"
$CC -o hello hello.c $CFLAGS $LDFLAGS

当我在 Android 终端上运行程序时发生了什么:

$ export PATH=/data/local/bin:$PATH
$ hello
Hello world!
[1] + Stopped (signal)        hello
$ exit
You have stopped jobs.
[1]   Illegal instruction      hello
$ exit

当我运行程序时它可以工作,但随后出现“停止”和“非法指令”。
我该怎么做才能解决这个问题?

【问题讨论】:

  • 你当然应该“返回 0;”在你的程序中,但为什么会崩溃,我不知道。
  • @AmigableClarkKant:在 C99 中,return 0; 是隐含的......
  • @KerrekSB,真的吗?对所有伟大而真实的事物是何等的侮辱!
  • 如何安装 Android NDK tool cahin?

标签: android c android-ndk


【解决方案1】:

我和@Amigable Clark Kent 一起讨论这个问题。想想你有什么。
你告诉编译器 main() 将返回一个 int。在运行时,加载器正准备从函数接收返回值,但实际上从未返回。不管是在寄存器还是堆栈中寻找它,那个地方都会存放错误的东西。

【讨论】:

  • 事实上,即使使用“return 0;”也会导致错误。唯一的区别是发生了“Segmentation fault”而不是“Illegal instruction”。
  • 您似乎覆盖了 main() 返回地址的值。如果您问我,这可能与您的链接器有关
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2014-06-13
  • 1970-01-01
相关资源
最近更新 更多