Можно ли запустить бинарный файл родной руки на телефоне без рута? - PullRequest
16 голосов
/ 16 января 2011

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

1 Ответ

37 голосов
/ 24 июля 2011

После использования набора инструментов, включенного в Android NDK, для компиляции ваших двоичных файлов, можно упаковать их в обычное приложение для Android и создать их как подпроцессы.

Вам нужно будет включить все необходимыефайлы в папке активов вашего приложения.Чтобы запустить их, необходимо, чтобы программа скопировала их из папки активов в доступное место, например: /data/data/com.yourdomain.yourapp/nativeFolder

Вы можете сделать это следующим образом:1005 *

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);
    }
}

Имейте в виду, что assetPath не является абсолютным, но относительно активов /.запустите ваше приложение и прочитайте его вывод, вы можете сделать что-то вроде этого:

  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();
...