Подтвердить что ты не робот

Возможно ли запустить собственный бинарный бит на неуправляемом телефоне Android?

Ну, я нырял в мутные воды низкоуровневого программирования на Android (собственный C/С++ с помощью инструментальной кодовой комбинации CodeSourcery). Я опробовал исполняемый файл на эмуляторе, и он сработал. Я хотел бы попробовать это на реальном устройстве. Поэтому я подключил свою связь и ввел файлы в файловую систему. Затем я попытался выполнить двоичный код, и я получил ошибку разрешения. Неважно, как я монтирую его, или куда я его отправляю, я не root, и это не позволяет мне его выполнить. Есть ли способ запустить такую ​​программу на некорневом телефоне?

4b9b3361

Ответ 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();