¿Cómo comstackr C en un archivo binario ejecutable y ejecutarlo en Android desde Android Shell?

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 comstackr este archivo con la cadena de herramientas Android NDK y podemos ejecutar el archivo ejecutable de este archivo

Encontré una cosa aquí, pero esto no funciona para mí. Estoy usando Android NDK, Revision 7b de Linux. No hay una estructura de directorios como esta.

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:
      #incluir 
     int main (int argc, char * argv [])
     {
         printf ("¡Hola, mundo!");
         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).

El mejor / más fácil lugar para poner un ejecutable es / data / local . También necesitarás modificar 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

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.

En una palabra,

Primero, para realizar una comstackció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 .