Как скомпилировать C в исполняемый двоичный файл и запустить его в Android из Android Shell?

У меня есть устройство, на котором я установил Android Gingerbread 2.3.4. Здесь я хочу запустить исполняемый файл C на Android-устройстве

Я могу запустить приложение Android NDK на устройстве и его запуск отлично. Но я хочу запустить только один исполняемый файл hello.c на устройстве.

 /* #includes #defines ... */ int main(){ // Do something when this is executed return 0; } 

Есть ли способ скомпилировать этот файл с помощью цепочки инструментов Android NDK , и мы можем запустить исполняемый файл этого файла

Я нашел одну вещь здесь, но это не работает для меня. Я использую Android NDK, Revision 7b Linux. Нет такой структуры каталогов, как эта

Во-первых, позвольте мне сказать, что мой ответ зависит от того, как вы используете NDK r7b (он будет работать и для r7c) в Linux (для правильного изменения пути для других систем).

Изменить: последний раз протестирован с NDK r8e на Linux и Nexus 4 с помощью adb из SDK Platform-Tools Rev 18 в Windows 7 (последний по состоянию на 2013-07-25) без доступа root .

Еще одно редактирование: прочитайте этот вопрос для изменения моей инструкции для собственных двоичных файлов, которые должны запускаться на Android 5.0 (Lollypop) и позже.

  1. Перейдите в $NDK_ROOT (Самая $NDK_ROOT папка почтового индекса NDK при распаковке).
  2. Скопируйте $NDK_ROOT/samples/hello-jni каталог как $NDK_ROOT/sources/hello-world .
  3. Перейдите в $NDK_ROOT/sources/hello-world .
  4. Отредактируйте AndroidManifest.xml чтобы дать приложению соответствующее имя (это необязательно).
  5. Перейдите в $NDK_ROOT/sources/hello-world/jni . Здесь находится исходный код.
  6. Измените hello-jni.c , удалите весь код и поместите в свой код hello world . Мой:
      #include 
     int main (int argc, char * argv [])
     {
         printf («Привет, мир!»);
         return 0;
     } 
  7. Отредактируйте Android.mk и измените строку include $(BUILD_SHARED_LIBRARY) чтобы include $(BUILD_EXECUTABLE) . Вы также можете изменить строку LOCAL_MODULE на имя, которое вы хотите для своего исполняемого файла (по умолчанию hello-jni )
  8. Вернуться к $NDK_ROOT/sources/hello-world
  9. Запустите ../../ndk-build чтобы создать исполняемый файл.
  10. Скопируйте его из $NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni в /data/local/tmp на устройстве Android и измените его разрешения на 755 (rwxr-xr-x). Если вы изменили строку LOCAL_MODULE в $NDK_ROOT/sources/hello-world/jni/Android.mk , исполняемое имя будет новым значением LOCAL_MODULE вместо hello-jni . (Все это делается через adb из Android SDK.)
  11. Выполните двоичный код с полным путем как /data/local/tmp/hello-jni , или как вы его назвали.

И вы закончили (и можете бесплатно начать работу с документацией в $ NDK_ROOT / docs, чтобы лучше понять, что делать).

Лучшее / простое место для размещения исполняемого файла – / data / local . Вам также потребуется выполнить chmod двоичный файл как исполняемый файл. Часто вам также нужно сделать это в два этапа, чтобы получить двоичный файл из /sdcard/ to /data/local :

 $ adb push mybin /sdcard/ $ adb shell $ cp /sdcard/mybin /data/local/mybin $ cd /data/local $ chmod 751 mybin 

Предостережения :

  • Не все системы имеют cp . Вы можете использовать cat, если это так:

    $ cat /sdcard/mybin > /data/local/mybin

  • Некоторые системы не позволяют записывать в /data/local для пользователя «shell». Попробовать /data/local/tmp

У меня недавно была такая же проблема с новой связью-5. Я хотел бы добавить, что / data / local не был доступен для записи пользователем («shell», uid 2000), который я получил с оболочкой adb. Но выполнение исполняемого файла в подкаталоге / data / local / tmp / работало нормально.

расположение «/ sdcard» не является исполняемым, что означает, что любой файл там вообще не работает.

единственный способ выполнить «adb push» выполнил бы их «/ data / local», который должен быть доступен для записи для adb и разрешить выполнение для любого.

В двух словах,

Во-первых, чтобы скомпилировать ваш код C с вашего хост-компьютера, используйте инструментальную цепочку NDK с параметром sysroot и независимым от позиции параметром -fPIE -pie .

 $NDKROOT/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-gcc \ --sysroot=$NDKROOT/platforms/android-22/arch-arm64 -fPIE -pie main.c -o main 

арка-часть arrch64 или arch-arm64 , версия 4.9 инструментальной цепочки, версия для платформы android-22 и бинарный формат для вашего хост-компьютера darwin-x86_64 могут отличаться в зависимости от вашей среды.

Во-вторых, нажмите ваш двоичный файл под /data/local/tmp и выполните его из adb shell .

  • Что такое sharedUserId в Android и как оно используется?
  • NDK - Как использовать сгенерированную библиотеку .so в другом проекте
  • SQLite с Android NDK
  • Как связать предварительно созданную общую библиотеку с проектом Android NDK?
  • Получить имена функций из стека вызовов
  • Как настроить NDK с плагином Android Gradle 0.7
  • Запуск автономной библиотеки на Android L. Ошибка: поддерживаются только независимые исполняемые файлы (PIE)
  • Ваш APP_BUILD_SCRIPT указывает на неизвестный файл с помощью Android ndk-build
  • Android NDK: нет правила, чтобы сделать цель
  • Как разрешить java.lang.UnsatisfiedLinkError в NDK на Android?
  • Создание видеофайла с изображений с помощью ffmpeg
  • Давайте будем гением компьютера.