2011-01-16 8 views
14

Beh, mi sono immerso nelle acque torbide della programmazione Android di basso livello (C/C++ nativo utilizzando la toolchain di CodeSourcery). Ho provato l'eseguibile su un emulatore e ha funzionato. Mi piacerebbe provarlo su un dispositivo reale. Così ho collegato il mio nexus e ho spinto i file sul filesystem. Quindi ho provato ad eseguire il binario e ho ricevuto un errore di autorizzazione. In realtà non importa come lo monto, o dove lo mando, non sono root e non mi permette di eseguirlo. C'è un modo per eseguire un programma come questo su un telefono non rootato?È possibile eseguire un binario nativo su un telefono Android non rootato?

+0

Sarà quasi certamente bisogno di root. Come l'hai mai ricevuto sul telefono se il tuo telefono non è radicato? – Falmarri

+3

Dove hai messo il binario? Non è possibile inserirlo nella sdcard perché è montato con l'opzione "noexec" (a meno che non sia root). –

+0

Esattamente, ecco perché non ha funzionato sulla sdcard. Sono stato in grado di metterlo in/dati (ma non sarebbe eseguito o addirittura lasciarmi chmod). Per quanto riguarda come mettere l'eseguibile nel filesystem: "adb push". – AnimatedRNG

risposta

33

Dopo aver utilizzato la toolchain inclusa in Android NDK per compilare i file binari, è possibile comprimerli con una tipica app per Android e farli generare come sottoprocessi.

Dovrai includere tutti i file necessari nella cartella delle risorse dell'applicazione. Al fine di farli funzionare, è necessario avere il programma copiarli dalla cartella attivi in ​​un percorso eseguibile come: /data/data/com.yourdomain.yourapp/nativeFolder

Si può fare questo in questo modo:

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); 
    } 
} 

Ricordare che assetPath non è assoluto ma rispetto alle attività /.

IE: "Attività/nativeFolder" è solo "nativeFolder"

Per eseguire l'applicazione e leggere la sua uscita si potrebbe fare qualcosa di simile:

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

Grazie! Questo ha funzionato perfettamente! – AnimatedRNG

+1

Felice di aiutare. Mi piacerebbe vedere Google rendere il lato non JNI del NDK un po 'più facile da usare. – sarwar

+0

Grazie per questo, mi ha reso la vita molto più facile! –

Problemi correlati