tutorial studio hechas español ejecutar cppdroid codigo apps android c android-ndk

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.

  1. Vaya a $NDK_ROOT (La carpeta más alta de NDK zip cuando se descomprime).
  2. Copie el $NDK_ROOT/samples/hello-jni como $NDK_ROOT/sources/hello-world .
  3. Vaya a $NDK_ROOT/sources/hello-world .
  4. Edite AndroidManifest.xml para darle a la aplicación un nombre apropiado (Esto es opcional).
  5. Vaya a $NDK_ROOT/sources/hello-world/jni . Aquí es donde está el código fuente.
  6. Edite hello-jni.c , elimine todo el código y hello-jni.c su código hello world . El mio es:

    #include int main( int argc, char* argv[]) { printf("Hello, World!"); return 0; }

  7. Edite Android.mk y cambie la línea, include $(BUILD_SHARED_LIBRARY) para include $(BUILD_EXECUTABLE) . También puede cambiar la línea LOCAL_MODULE al nombre que desee para su ejecutable (el valor predeterminado es hello-jni )
  8. Regrese a $NDK_ROOT/sources/hello-world
  9. Ejecute ../../ndk-build para crear el ejecutable.
  10. $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ínea LOCAL_MODULE en $NDK_ROOT/sources/hello-world/jni/Android.mk , el nombre del ejecutable será el nuevo valor de LOCAL_MODULE lugar de hello-jni . (Todo esto se hace a través de adb del SDK de Android).
  11. 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.