Ну, я нырял в мутные воды низкоуровневого программирования на Android (собственный C/С++ с помощью инструментальной кодовой комбинации CodeSourcery). Я опробовал исполняемый файл на эмуляторе, и он сработал. Я хотел бы попробовать это на реальном устройстве. Поэтому я подключил свою связь и ввел файлы в файловую систему. Затем я попытался выполнить двоичный код, и я получил ошибку разрешения. Неважно, как я монтирую его, или куда я его отправляю, я не root, и это не позволяет мне его выполнить. Есть ли способ запустить такую программу на некорневом телефоне?
Возможно ли запустить собственный бинарный бит на неуправляемом телефоне Android?
Ответ 1
После использования инструментальной цепочки, включенной в Android NDK для компиляции ваших двоичных файлов, их можно упаковать с помощью обычного приложения для Android и включить их в качестве подпроцессов.
Вам нужно будет указать все необходимые файлы в папке с ресурсами вашего приложения. Чтобы запустить их, вы должны будете скопировать их из папки активов в текущее место, например:/data/data/com.yourdomain.yourapp/nativeFolder
Вы можете сделать это так:
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);
}
}
Имейте в виду, что propertyPath не является абсолютным, а в отношении активов /.
IE: "assets/nativeFolder" - это только "nativeFolder"
Чтобы запустить приложение и прочитать его вывод, вы можете сделать что-то вроде этого:
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();