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?
risposta
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();
Grazie! Questo ha funzionato perfettamente! – AnimatedRNG
Felice di aiutare. Mi piacerebbe vedere Google rendere il lato non JNI del NDK un po 'più facile da usare. – sarwar
Grazie per questo, mi ha reso la vita molto più facile! –
- 1. Come verificare se il telefono Android è rootato?
- 2. è possibile installare java fx su un telefono Android?
- 3. Emulazione del file hosts su Android non rootato
- 4. È possibile eseguire Android JVM su un PC?
- 5. nativo di React su Android 4.0.3. Possibile?
- 6. È possibile eseguire il debug di un javascript sul browser nativo di un tablet Samsung
- 7. È possibile rilevare se un telefono Android ha una trackball?
- 8. È possibile sviluppare per Android su Android?
- 9. come eseguire il debug del codice nativo puro su Android?
- 10. Java: perché non è possibile eseguire iterazioni su un iteratore?
- 11. È possibile installare il JDK su un dispositivo Android?
- 12. È possibile eseguire una riduzione su un array con openmp?
- 13. Come eseguire il debug del browser nativo di Android (non di Chrome) su un computer desktop?
- 14. Calcola Pi su un telefono Android
- 15. Installazione di un binario precompilato su Android: "non trovato"
- 16. Android: non è possibile digitare un EditText
- 17. È possibile controllare la luce della videocamera su un telefono tramite un sito Web?
- 18. Determinare se un dispositivo Android è rootato a livello di codice?
- 19. È possibile installare automaticamente un'app Android ed eseguire un aggiornamento?
- 20. È possibile eseguire un emulatore Android senza impostare Eclipse
- 21. Impossibile eseguire "invio" su "xmlhttprequest" non è stato possibile caricare
- 22. Sveglia telefono Android su un'interruzione, su un GPIO
- 23. È possibile eseguire la console heroku su un DB follower?
- 24. È possibile eseguire un caricamento di gruppo su Amazon s3?
- 25. HQL: è possibile eseguire un JOIN INTERNO su una sottoquery?
- 26. È possibile eseguire un archivio HAR su google chrome?
- 27. Compilazione di app Android su un telefono attuale
- 28. Come eseguo un binario compilato in Android?
- 29. È possibile utilizzare lo stile ActionBarSherlock su TabWidget nativo?
- 30. È possibile eseguire manualmente un controllo logrotate?
Sarà quasi certamente bisogno di root. Come l'hai mai ricevuto sul telefono se il tuo telefono non è radicato? – Falmarri
Dove hai messo il binario? Non è possibile inserirlo nella sdcard perché è montato con l'opzione "noexec" (a meno che non sia root). –
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