Как скомпилировать C-программу для Genymotion (Android x86)
Я пытаюсь создать простое приложение 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 арка вместо ARM
Вторая попытка: создать с помощью автономного инструментального средства x86
-
Сделать x86 одиночной toolchain первым
cd $NDK/build/tools
./make-standalone-toolchain.sh --arch=x86 --platform=android-19 --install-dir=/tmp/android-toolchain --ndk-dir=../../. --system=linux-x86_64
-
Создайте Hello, используя toolchain
cd tmp/android-toolchain/bin
./i686-linux-android-gcc -o Hello -c hello.c
-
Запустите Hello on 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
на машине genymotion.
Ran file Hello
в исполняемом файле
![Информация о файле Hello]()
Итак, это должно быть совпадение.
По-прежнему возникает ошибка. Было бы очень приятно, если бы кто-то мог пролить свет.
Изменить 1: Пробовал запуск исполняемого файла в /data/local/tmp вместо/sdcard/. Все еще дает ту же ошибку.
Отредактируйте 2: Ran uname
в системе genymotion и file
в исполняемом файле, чтобы увидеть, соответствуют ли они.
Ответы
Ответ 1
Если обычный GCC не выполнит вашу работу, вам придется пройти более сложный маршрут.
Вам нужна кросс-цепочка; Я предлагаю создать канадскую кросс-цепочку с помощью Crosstool ~ ng; вы можете использовать автономную инструментальную цепочку NDK в качестве отправной точки.