2011-01-16 18 views
14

Bueno, he estado buceando en las turbias aguas de la programación de Android de bajo nivel (C/C++ nativo usando la cadena de herramientas CodeSourcery). Probé el ejecutable en un emulador y funcionó. Me gustaría probarlo en un dispositivo real. Así que conecté mi nexo y envié los archivos al sistema de archivos. Luego traté de ejecutar el binario, y obtuve un error de permiso. Realmente no importa cómo lo monte, o dónde lo envío, no soy root y no me deja ejecutarlo. ¿Hay alguna manera de ejecutar un programa como este en un teléfono no rooteado?¿Es posible ejecutar un binario de brazo nativo en un teléfono Android no rooteado?

+0

Es casi seguro que necesitará raíz. ¿Cómo lo conseguiste por teléfono si tu teléfono no está rooteado? – Falmarri

+3

¿Dónde pusiste el binario? No se puede poner en la tarjeta SD porque está montada con la opción "noexec" (a menos que esté enraizada). –

+0

Exactamente, es por eso que no funcionó en la tarjeta SD. Pude ponerlo en/data (pero no se ejecutaría o incluso me dejaría modificarlo). En cuanto a cómo poner el ejecutable en el sistema de archivos: "empujar adb". – AnimatedRNG

Respuesta

33

Después de usar la cadena de herramientas incluida en el NDK de Android para compilar sus binarios, es posible empaquetarlos con una aplicación típica de Android y tenerlos generados como subprocesos.

Deberá incluir todos los archivos necesarios en la carpeta de activos de su aplicación. Con el fin de ejecutar ellos, usted tiene que tener el programa copiarlos desde la carpeta de activos a un lugar ejecutable como: /data/data/com.yourdomain.yourapp/nativeFolder

Usted puede hacer esto de esta manera:

private static void copyFile(String assetPath, String localPath, Context context) { 
    try { 
     InputStream in = context.getAssets().open(assetPath); 
     FileOutputStream out = new FileOutputStream(localPath); 
     int read; 
     byte[] buffer = new byte[4096]; 
     while ((read = in.read(buffer)) > 0) { 
      out.write(buffer, 0, read); 
     } 
     out.close(); 
     in.close(); 

    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

Tenga en cuenta que assetPath no es absoluto, pero con respecto a los activos /.

IE: "activos/nativeFolder" es simplemente "nativeFolder"

A continuación, ejecutar la aplicación y leer su producción se podría hacer algo como esto:

Process nativeApp = Runtime.getRuntime().exec("/data/data/com.yourdomain.yourapp/nativeFolder/application"); 


      BufferedReader reader = new BufferedReader(new InputStreamReader(nativeApp.getInputStream())); 
      int read; 
      char[] buffer = new char[4096]; 
      StringBuffer output = new StringBuffer(); 
      while ((read = reader.read(buffer)) > 0) { 
       output.append(buffer, 0, read); 
      } 
      reader.close(); 

      // Waits for the command to finish. 
      nativeApp.waitFor(); 

      String nativeOutput = output.toString(); 
+0

¡Gracias! Esto funcionó a la perfección! – AnimatedRNG

+1

Feliz de ayudar. Me encantaría que google haga que el lado no JNI del NDK sea un poco más fácil de usar. – sarwar

+0

¡Gracias por esto, hizo mi vida mucho más fácil! –

Cuestiones relacionadas