Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Во-первых, позвольте мне сказать, что мой ответ зависит от использования 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) и позже.

  • Перейдите в $NDK_ROOT (Самая верхняя папка ZIP NDK при распаковке).
  • Скопируйте каталог $NDK_ROOT/samples/hello-jni как $NDK_ROOT/sources/hello-world.
  • Перейдите к $NDK_ROOT/sources/hello-world.
  • Изменить AndroidManifest.xml, чтобы дать приложению соответствующее имя (это необязательно).
  • Перейдите к $NDK_ROOT/sources/hello-world/jni. Здесь находится исходный код.
  • Измените hello-jni.c, удалите весь код и введите код hello world. Шахта:
    #include 
    int main( int argc, char* argv[])
    {
        printf("Hello, World!");
        return 0;
    }
  • Измените Android.mk и измените строку include $(BUILD_SHARED_LIBRARY) на include $(BUILD_EXECUTABLE). Вы также можете изменить строку LOCAL_MODULE на имя, которое вы хотите для своего исполняемого файла (по умолчанию это hello-jni)
  • Вернитесь к $NDK_ROOT/sources/hello-world
  • Запустите ../../ndk-build, чтобы создать исполняемый файл.
  • Скопируйте его с $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.)
  • Выполните двоичный код с полным путем как /data/local/tmp/hello-jni или как вы его назвали.

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Во-первых, чтобы скомпилировать свой код 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.