如何编译Genymotion的C程序(Android x86)

时间:2015-10-23 12:46:40

标签: android c gcc android-ndk genymotion

我正在尝试构建一个简单的HelloWorld应用程序并在Genymotion上运行它。 我的建筑系统是Ubuntu 14.04 64bit。我安装了Android SDK(r22.6.2)和NDK(r9d)。

首次尝试:使用预建的NDK ARM工具链构建

TOOLCHAIN = $NDK/toolchains/arm-linux-androideabi-4.8
$TOOLCHAIN/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$PLATFORM hello.c -o hello
adb push hello /sdcard/
./hello

我收到错误

/system/bin/sh: ./Hello: not executable: magic 7F45

在做了一些研究之后,我很快意识到Genymotion有 x86 arch而不是 ARM

第二次尝试:使用x86 Standalone ToolChain构建

  1. 首先制作x86 standlone工具链

    cd $NDK/build/tools
    ./make-standalone-toolchain.sh --arch=x86 --platform=android-19 --install-dir=/tmp/android-toolchain --ndk-dir=../../. --system=linux-x86_64
    
  2. 使用工具链构建Hello

    cd tmp/android-toolchain/bin
    ./i686-linux-android-gcc -o Hello -c hello.c
    
  3. 在Genymotion上运行Hello

    adb push hello /data/local/tmp
    adb shell
    cd /data/local/tmp
    ./hello
    /system/bin/sh: ./Hello: not executable: magic 7F45
    
  4. 在genymotion机器上运行uname -aAndroid System Name 在可执行文件上运行file Hello Hello File info

    所以应该是一场比赛。

    仍然得到同样的错误。如果有人可以解释一下,我会非常感激。

    编辑1:尝试在/ data / local / tmp中运行可执行文件而不是/ sdcard /。仍然会出现同样的错误。

    编辑2:在genymotion系统上运行uname,在可执行文件上运行file以查看它们是否匹配。

1 个答案:

答案 0 :(得分:1)

如果简单的海湾合作委员会没有完成你的工作,你将不得不采取更艰难的路线。

你需要一个交叉工具链;我建议使用Crosstool~ng生成一个加拿大交叉工具链;您可以使用NDK的独立工具链作为起点。