Question

Eh bien, je suis plongée dans les eaux troubles de faible niveau de programmation Android (natif C / C ++ en utilisant l'ensemble des outils CodeSourcery). J'ai essayé l'exécutable sur un émulateur et cela a fonctionné. Je voudrais l'essayer sur un vrai appareil. Donc, je l'ai branché à mon nexus et poussé les fichiers sur le système de fichiers. Alors j'ai essayé d'exécuter le binaire, et je suis une erreur de permission. Il n'a vraiment pas comment je le monter, ou où je l'envoie, je ne suis pas racine et il ne me laissez pas l'exécuter. Est-il possible d'exécuter un programme comme celui-ci sur un téléphone non enraciné?

Était-ce utile?

La solution

Après avoir utilisé l'ensemble des outils inclus dans l'Android NDK pour compiler vos binaires, il est possible de les emballer avec une application Android typique et les ont spawn comme sous-processus.

Vous devez inclure tous les fichiers nécessaires dans les actifs dossier de votre application. Pour les exécuter, vous devez avoir le programme les copier des actifs dossier vers un emplacement runnable comme: /data/data/com.yourdomain.yourapp/nativeFolder

Vous pouvez le faire comme ceci:

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

Gardez à l'esprit que le assetPath n'est pas absolue, mais en ce qui concerne les actifs /.

IE: "actifs / nativeFolder" est juste "nativeFolder"

Pour ensuite exécuter votre application et lire sa sortie, vous pouvez faire quelque chose comme ceci:

  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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top