20

さて、私は低レベルの Android プログラミング (CodeSourcery ツールチェーンを使用したネイティブ C/C++) の濁った海に飛び込んできました。エミュレーターで実行可能ファイルを試してみましたが、うまくいきました。実機で試してみたいと思います。そこで、nexus を接続し、ファイルをファイル システムにプッシュしました。次に、バイナリを実行しようとしましたが、パーミッション エラーが発生しました。どのようにマウントするか、またはどこに送信するかは問題ではありません。ルートではないため、実行できません。ルート化されていない電話でこのようなプログラムを実行する方法はありますか?

4

1 に答える 1

40

Android NDK に含まれるツールチェーンを使用してバイナリをコンパイルした後、それらを一般的な Android アプリと一緒にパッケージ化し、サブプロセスとして生成することができます。

アプリケーションの assets フォルダー内に必要なすべてのファイルを含める必要があります。それらを実行するには、プログラムでアセットフォルダーから /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);
    }
}

assetPath は絶対的なものではなく、assets/ に関するものであることに注意してください。

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();
于 2011-07-23T21:01:19.170 に答える