2015-10-23 12 views
10

Ich versuche, eine einfache HelloWorld-Anwendung zu erstellen und es auf Genymotion ausführen. Mein Bausystem ist Ubuntu 14.04 64bit. Ich habe Android SDK (r22.6.2) und NDK (r9d) installiert.Wie kompiliere ich ein C-Programm für Genymotion (Android x86)

ersten Versuch: Erstellen Sie die vorkompilierte NDK ARM Toolchain mit

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 

Ich erhalte eine Fehler

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

Nach einigen Recherchen habe ich schnell erkennen Genymotion x86 Bogen hat statt ARM

Zweiter Versuch: Erstellen mit x86 Standalone-Tool Kette

  1. Make x86 standlone Toolchain erste

    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. Bauen Hallo

    cd tmp/android-toolchain/bin 
    ./i686-linux-android-gcc -o Hello -c hello.c 
    
  3. Run Hallo auf Genymotion

    adb push hello /data/local/tmp 
    adb shell 
    cd /data/local/tmp 
    ./hello 
    /system/bin/sh: ./Hello: not executable: magic 7F45 
    
die Werkzeugkette mit

Lief uname -a auf dem Genymotion-Maschine. Android System Name Ran file Hello auf dem ausführbaren Hello File info

So soll es ein Spiel sein.

Immer noch den gleichen Fehler. Würde es wirklich schätzen, wenn jemand etwas Licht abwerfen könnte.

Bearbeiten 1: Versuchte Ausführen der ausführbaren Datei in/data/local/tmp anstelle von/sdcard /. Gibt immer noch den gleichen Fehler.

Edit 2: Ran uname auf genymotion System und file auf die ausführbare Datei, um zu sehen, ob sie übereinstimmen.

+0

Ich glaube, es gibt eine Verwirrung: Sie drücken 'hallo' auf'/sdcard', aber führen 'Hallo' aus'/'(Stammverzeichnis). Auf jeden Fall mountet Android die/SD-Karte und anderen externen Speicher aus Sicherheitsgründen als nicht ausführbar. Wenn Sie Ihre ausführbare Datei pushen und ausführen möchten, verwenden Sie daher ein anderes Verzeichnis. '/ data/local/tmp' ist normalerweise eine gute Wahl. –

+0

Ich habe gerade versucht, die ausführbare Datei in/data/local/tmp auszuführen. Gibt mir immer noch den gleichen Fehler – HBZ

+0

Haben Sie 'chmod 700/data/local/tmp/hallo' ausgeführt? –

Antwort

1

Wenn Plain GCC Ihre Arbeit nicht erledigt, müssen Sie den härteren Weg gehen.

Sie benötigen eine Cross-Toolchain; Ich schlage vor, eine kanadische Cross Toolchain mit Crosstool ~ ng zu erzeugen; Sie können die eigenständige Toolchain von NDK als Ausgangspunkt verwenden.