2015-10-23 19 views
10

Sto provando a creare una semplice applicazione HelloWorld ed eseguirla su Genymotion. Il mio sistema di costruzione è Ubuntu 14.04 64 bit. Ho installato Android SDK (r22.6.2) e NDK (r9d).Come compilare un programma C per Genymotion (Android x86)

primo tentativo: costruire utilizzando il precompilati NDK ARM toolchain

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 

ottengo un errore

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

Dopo aver fatto qualche ricerca, mi rendo conto subito Genymotion ha x86 arco al posto di ARM

Secondo tentativo: creare utilizzando lo strumento autonomo x86 Catena

  1. Marchio x86 standlone toolchain primo

    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. Costruire Ciao utilizzando la toolchain

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

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

Ran uname -a sulla macchina genomotion. Android System Name Ran file Hello sull'eseguibile Hello File info

quindi dovrebbe essere una partita.

Sempre con lo stesso errore. Lo apprezzerei davvero se qualcuno potesse far luce.

Modifica 1: Provato a eseguire l'eseguibile in/data/local/tmp invece di/sdcard /. Dà ancora lo stesso errore.

Edit 2: Ran uname sul sistema genymotion e file sul file eseguibile per vedere se corrispondono.

+0

Credo ci sia una confusione: si spinge 'ciao' in'/sdcard', ma si esegue 'Hello' da'/'(directory root). Ad ogni modo, Android monta la/sdcard e l'altra memoria esterna come non eseguibili, per ragioni di sicurezza. Quindi, se vuoi spingere ed eseguire il tuo eseguibile, usa qualche altra directory. '/ data/local/tmp' è di solito una buona scelta. –

+0

Ho appena provato a eseguire l'eseguibile in/data/local/tmp. Ancora mi dà lo stesso errore – HBZ

+0

Hai eseguito 'chmod 700/data/local/tmp/hello'? –

risposta

1

Se GCC non riesce a completare il tuo lavoro, dovrai seguire la strada più difficile.

È necessaria una cross-toolchain; Suggerisco di generare una croce canadese con toolchain usando Crosstool ~ ng; puoi utilizzare la toolchain autonoma di NDK come punto di partenza.

Problemi correlati