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

У меня есть устройство, на котором я установил 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 Нет такой структуры каталогов

Ответы [ 5 ]

39 голосов
/ 24 апреля 2012

Во-первых, позвольте мне сказать, что мой ответ зависит от того, используете ли вы 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 в разархивированном виде). ​​
  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("Hello, World!");
        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, чтобы получить лучшее представление о том, что делать).

24 голосов
/ 26 марта 2012

Лучшее / простое место для размещения исполняемого файла - / data / local .Вам также понадобится chmod двоичный файл как исполняемый файл.Часто вам также нужно сделать это в два шага, чтобы получить двоичный файл от /sdcard/ до /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 дляпользователь "оболочки".Попробуйте /data/local/tmp

12 голосов
/ 25 ноября 2013

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

11 голосов
/ 26 марта 2012

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

единственный способ запустить исполняемый файл "adb push" - поместить их в "/ data / local", который должен быть доступен для записи в adb и разрешать выполнение для всех.

4 голосов
/ 26 октября 2016

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

Во-первых, для кросс-компиляции кода 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...