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! –
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