Как скомпилировать 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
, и мы можем запустить исполняемый файл этого файла
- Создание продукта SDK: как добавить собственный lib (.so) и банку с SDK, который я создаю?
- NDK: как включить * .so файлы в AndroidStudio
- Android NDK C ++ JNI (нет реализации для родных ...)
- Android NDK учебник / руководство для начинающих.
- Как создать исполняемый файл для оболочки Android
Я нашел одну вещь здесь, но это не работает для меня. Я использую Android NDK, Revision 7b
Linux. Нет такой структуры каталогов, как эта
- Как найти утечки памяти из собственного кода в android
- java.lang.ClassNotFoundException: Не нашел class на пути: dexpathlist
- Как передать C-структуры обратно и обратно на Java-код в JNI?
- System.loadLibrary (...) не смог найти родную библиотеку в моем случае
- Файл записи NDK для Android
- Как упаковать приложение командной строки в apk?
- как использовать mkfifo с помощью Android NDK
- Какова связь между APP_PLATFORM, android: minSdkVersion и android: targetSdkVersion?
Во-первых, позвольте мне сказать, что мой ответ зависит от того, как вы используете 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
(Самая$NDK_ROOT
папка почтового индекса 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 («Привет, мир!»); 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, чтобы лучше понять, что делать).
Лучшее / простое место для размещения исполняемого файла – / 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
.