studio - ¿Cómo compilar C en un archivo binario ejecutable y ejecutarlo en Android desde Android Shell?
cppdroid tutorial español (5)
Tengo un dispositivo en el que instalé Android Gingerbread 2.3.4. Aquí quiero ejecutar el archivo ejecutable C en un dispositivo Android.
Puedo ejecutar la aplicación android NDK en el dispositivo y su ejecución es perfecta. Pero quiero ejecutar solo un archivo ejecutable hello.c
en el dispositivo.
/* #includes #defines ... */
int main(){
// Do something when this is executed
return 0;
}
¿Hay alguna forma de compilar este archivo con la cadena de herramientas Android NDK
y podemos ejecutar el archivo ejecutable de este archivo
Encontré una cosa here pero esto no funciona para mí. Estoy usando Android NDK, Revision 7b
de Linux. No hay una estructura de directorios como esta.
El mejor / más fácil lugar para poner un ejecutable es / data / local . También necesitarás chmod el binario como ejecutable. A menudo, también necesitará hacer esto en dos pasos para obtener el binario de /sdcard/
a /data/local
:
$ adb push mybin /sdcard/
$ adb shell
$ cp /sdcard/mybin /data/local/mybin
$ cd /data/local
$ chmod 751 mybin
Advertencias :
No todos los sistemas tienen
cp
. Puedes usar cat si este es el caso:$ cat /sdcard/mybin > /data/local/mybin
Algunos sistemas no permiten escribir
/data/local
para el usuario "shell". Pruebe/data/local/tmp
En una palabra,
Primero, para realizar una compilación cruzada de su código C desde su equipo host, utilice la herramienta NDK toolchain con la opción sysroot y la opción independiente de posición -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
la parte del arco arrch64
o arch-arm64
, la versión de la versión toolchain 4.9
, la versión de la plataforma parte android-22
, y el formato binario para su máquina host darwin-x86_64
puede variar según su entorno.
Segundo, presione su binario en /data/local/tmp
y ejecútelo desde adb shell
.
Primero, permítame decir que mi respuesta depende de que use NDK r7b (también funcionará para r7c) en Linux (cambie las rutas de forma adecuada para otros sistemas).
Edición: probado por última vez con NDK r8e
en Linux y Nexus 4
con adb
de SDK Platform-Tools Rev 18
en Windows 7 (lo más reciente hasta 2013-07-25) sin acceso de root .
Sin embargo, otra edición: lea esta pregunta para modificar mi instrucción para los archivos binarios nativos que deben ejecutarse en Android 5.0 (Lollypop) y posterior.
- Vaya a
$NDK_ROOT
(La carpeta más alta de NDK zip cuando se descomprime). - Copie el
$NDK_ROOT/samples/hello-jni
como$NDK_ROOT/sources/hello-world
. - Vaya a
$NDK_ROOT/sources/hello-world
. - Edite
AndroidManifest.xml
para darle a la aplicación un nombre apropiado (Esto es opcional). - Vaya a
$NDK_ROOT/sources/hello-world/jni
. Aquí es donde está el código fuente. - Edite
hello-jni.c
, elimine todo el código yhello-jni.c
su códigohello world
. El mio es:#include int main( int argc, char* argv[]) { printf("Hello, World!"); return 0; }
- Edite
Android.mk
y cambie la línea,include $(BUILD_SHARED_LIBRARY)
parainclude $(BUILD_EXECUTABLE)
. También puede cambiar la líneaLOCAL_MODULE
al nombre que desee para su ejecutable (el valor predeterminado eshello-jni
) - Regrese a
$NDK_ROOT/sources/hello-world
- Ejecute
../../ndk-build
para crear el ejecutable. -
$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni
desde$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni
a/data/local/tmp
en el dispositivo Android y cambie sus permisos a 755 (rwxr-xr-x). Si cambió la líneaLOCAL_MODULE
en$NDK_ROOT/sources/hello-world/jni/Android.mk
, el nombre del ejecutable será el nuevo valor deLOCAL_MODULE
lugar dehello-jni
. (Todo esto se hace a través deadb
del SDK de Android). - Ejecute el binario con la ruta completa como
/data/local/tmp/hello-jni
, o como lo haya llamado.
Y listo (y puede comenzar la documentación en $ NDK_ROOT / docs para tener una mejor idea de qué hacer).
Recientemente tuve el mismo problema en un nuevo nexus-5. Me gustaría añadir que / data / local no fue modificable por el usuario ("shell", uid 2000) Obtuve con adb shell. Pero poner el ejecutable en el subdirectorio / data / local / tmp / funcionó bien.
la ubicación "/ sdcard" no es ejecutable, lo que significa que ningún archivo allí es ejecutable.
la única forma de ejecutar el comando "adb push" sería colocarlos en "/ data / local", que debería poder escribirse para adb, y permitir la ejecución para cualquier persona.