Nun, ich tauche in den trüben Gewässern der Low-Level-Android-Programmierung (natives C/C++ mit der CodeSourcery Toolchain). Ich habe die ausführbare Datei auf einem Emulator ausprobiert und es hat funktioniert. Ich möchte es auf einem echten Gerät ausprobieren. Also steckte ich meinen Nexus ein und schob die Dateien in das Dateisystem. Dann habe ich versucht, die Binärdatei auszuführen, und ich habe einen Berechtigungsfehler erhalten. Es spielt wirklich keine Rolle, wie ich es mounte oder wohin ich es sende, ich bin nicht root und es lässt mich nicht ausführen. Gibt es eine Möglichkeit, ein Programm wie dieses auf einem nicht gerooteten Telefon auszuführen?Ist es möglich, eine native Arm-Binärdatei auf einem nicht verwurzelten Android-Telefon auszuführen?
Ist es möglich, eine native Arm-Binärdatei auf einem nicht verwurzelten Android-Telefon auszuführen?
Antwort
Nach der Verwendung der Toolchain, die im Android NDK enthalten ist, um Ihre Binärdateien zu kompilieren, ist es möglich, sie mit einer typischen Android-App zu verpacken und sie als Subprozesse zu erzeugen.
Sie müssen alle erforderlichen Dateien in den Ordner "Assets" Ihrer Anwendung aufnehmen. Um sie zu laufen, müssen Sie das Programm kopieren Sie sie aus dem Vermögen Ordner zu einem runnable Ort wie: /data/data/com.yourdomain.yourapp/nativeFolder
Sie können dies wie folgt:
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);
}
}
Beachten Sie, dass der AssetPath nicht absolut, sondern in Bezug auf Assets/ist.
IE: "assets/nativeFolder" nur "nativeFolder"
Um dann Ihre Anwendung ausführen und seine Ausgabe lesen Sie so etwas tun könnte:
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();
Danke! Das hat perfekt funktioniert! – AnimatedRNG
Gerne helfen. Würde gerne sehen, dass Google die Nicht-JNI-Seite des NDK ein wenig einfacher zu benutzen macht. – sarwar
Danke dafür, hat mein Leben viel einfacher gemacht! –
Sie werden mit ziemlicher Sicherheit root brauchen. Wie hast du es überhaupt am Telefon bekommen, wenn dein Telefon nicht verwurzelt ist? – Falmarri
Wo hast du die Binärdatei abgelegt? Sie können es nicht auf die SD-Karte setzen, da es mit der Option "noexec" gemountet ist (sofern nicht rooted). –
Genau, deshalb hat es auf der SD-Karte nicht funktioniert. Ich konnte es in/data (aber es würde nicht ausgeführt werden oder lassen Sie mich chmod es). Wie, wie die ausführbare Datei in das Dateisystem: "adb push". – AnimatedRNG