Intereting Posts
Как включить слой трафика на Google Maps? Сбой браузера эмулятора Android Как изменить ветку git в Android Studio Кордова Не удалось зарезервировать достаточно места для кучи объектов 2097152KB Как нарисовать свободный полигон в карте Google V2 в Android? Android: установка сетки динамических и настраиваемых объектов внутри другой сетки динамических и пользовательских объектов Кодировка URL в Android Как реализовать перетаскивание для Android маркера? Android: Я использую библиотеку AChartEngine для графиков, но не могу интегрировать графический вид артангинга с помощью android xml? Не найден ресурс, соответствующий заданному имени Theme.Sherlock.Dialog Android MediaPlayer – иногда не воспроизводится видео, хотя звуковые композиции Получить список пользователей ListView, которые не отображаются Android datepicker min max дата до уровня АИП 11 Истекает ли идентификатор регистрации GCM? Ошибка Eclipse: NoClassDefFoundError: java / lang / ref / FinalReference

Как скомпилировать 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. Нет такой структуры каталогов, как эта

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

Во-первых, позвольте мне сказать, что мой ответ зависит от вашего использования 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 . Мой:
      #включают 
     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 

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

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

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

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

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

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