2011-01-16 6 views
14

私は、低レベルのAndroidプログラミング(CodeSourceryツールチェーンを使用しているネイティブC/C++)の暗い海でダイビングしてきました。私はエミュレータで実行可能ファイルを試してみました。私は実際のデバイスでそれを試してみたいです。そこで、私は自分のネクサスを接続し、ファイルシステムにファイルをプッシュしました。次にバイナリを実行しようとしましたが、パーミッションエラーが発生しました。私はそれをマウントする方法や、どこに送るのかは関係ありません。私はルートではなく、実行させません。ルートのない電話でこれを実行する方法はありますか?根付いていないAndroid端末でネイティブアームバイナリを実行することはできますか?

+0

あなたはほぼ確実にルートが必要になります。あなたの携帯電話が根ざされていない場合、どのようにあなたはそれを電話で入手しましたか? – Falmarri

+3

バイナリはどこに置いたのですか? "noexec"オプションでマウントされているため、sdcardに置くことはできません(rooted以外の場合)。 –

+0

正確には、それがsdcardで動作しなかった理由です。私は/ dataに置くことができました(しかし、それは実行されません、あるいは私にchmodをさせてしまいます)。実行可能ファイルをファイルシステムにどのように置くかについては、 "adb push"。 – AnimatedRNG

答えて

33

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:「資産/ 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(); 
+0

ありがとう!これは完全に機能しました! – AnimatedRNG

+1

お寄せいただきありがとうございます。 GoogleがNDKの非JNI側を少し使いやすくするのが大好きです。 – sarwar

+0

これはおかげで、私の人生はずっと楽になりました! –

関連する問題