Czy można uruchomić natywny binarny arm na nie zakorzenionym telefonie z Androidem?

Cóż, nurkowałem w mrocznych wodach niskopoziomowego programowania Androida (natywnego C/C++ za pomocą łańcucha narzędzi CodeSourcery). Wypróbowałem plik wykonywalny na emulatorze i zadziałało. Chciałbym go wypróbować na prawdziwym urządzeniu. Więc podłączyłem mój nexus i wepchnąłem pliki do systemu plików. Potem próbowałem uruchomić plik binarny i dostałem błąd uprawnień. To naprawdę nie ma znaczenia, jak go zamontować, lub gdzie go wysłać, Nie jestem root i nie pozwala mi go wykonać. Czy jest jakiś sposób na uruchomić taki program na telefonie nie zakorzenionym?

Author: sarwar, 2011-01-16

1 answers

Po użyciu zestawu narzędzi dołączonego do systemu Android NDK do kompilacji plików binarnych, możliwe jest zapakowanie ich w typową aplikację na Androida i odradzanie ich jako podprocesów.

Konieczne będzie umieszczenie wszystkich niezbędnych plików w folderze zasoby aplikacji. Aby je uruchomić, program musi skopiować je z folderu assets do możliwej do uruchomienia lokalizacji, takiej jak: / data/data / com.Twoja domena.yourapp / nativeFolder

Możesz to zrobić jak więc:

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

Należy pamiętać, że ścieżka aktywów nie jest bezwzględna, ale w odniesieniu do aktywów/.

IE: "aktywa / nativeFolder" jest po prostu "nativeFolder"

Aby następnie uruchomić aplikację i odczytać jej wynik, możesz zrobić coś takiego:

  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();
 36
Author: sarwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-25 21:55:45