2012-05-07 31 views
1

コードオーロラのFMラジオコードを取得し、Android Gingerbreadのコードベースとマージしました。Android:JNI implementaionでデバイスファイルを開くことができません

FM appフレームワークは、ファイルandroid_hardware_fm.cppで実装されているJNIを使​​用してfm無線デバイス(/ dev/radio)にアクセスしようとします。このファイルには、読み取り/書き込みモードでopen()を使用してデバイスノードにファイル記述子を取得しようとする関数があります。ただし、呼び出しがエラーコード-13で失敗します。アクセスが拒否されました。

また、(RDWRモードで)/ dev/radioファイルを開こうとする小さなC実行可能ファイルを作成し、そのfdを出力して閉じます。ターゲットシステムの/ system/binから実行され、有効なfdが表示されます。

BtwのJNI実装は、アンドロイドコアライブラリの一部です。これはframeworks/base/core/jniにあり、libandroid_runtime.soの一部としてコンパイルされています

アイデア/ソリューションはありますか?前もって感謝します。

+0

4年後、私は本当に似たような問題を抱えています:http://stackoverflow.com/questions/37486349 私は実行ファイルをアプリケーションと同じUIDとして実行して動作させています。以下の答え。あなたは解決策を見つけましたか? – jkoreska

+0

@jkoreska私は回避策を使用したと思います。以下の答えの私のコメントを参照してください。 – trans1st0r

答えて

1

ユーザー空間からデバイスを開く権限がないことは明らかです。 2番目のケースでは、ターミナルから実行可能ファイルを実行しているときに、実行可能ファイルを実行する前にsuを実行した可能性が高いためアクセス権がある可能性があります。

ここでの問題は2つあります。

1)ノードのアクセス許可をterimnalから変更します。関与

ステップ:

  • オープンターミナル(adb shell

  • suを行います(これを行うためには、あなたのデバイスが根ざしている必要があります)

  • chmod 777 /dev/radioを実行します。端末

これが完了すると、無線ノードは、ユーザーが読み書きするための適切な権限を持っています。だから今open()コールをすることができ、それは動作します。

2)プログラム、あなたのデバイスが根ざしていると、suコマンドは以下の関数を呼び出すことによって)あなたのデバイス上で実行されているとすると(これを達成することができます - changePerm()を。これは私が書いた小さな機能で、デバイスノードのパーミッションやユーザーアクセス権を持たないシステムファイルのパーミッションを変更します。権限があれば、ユーザー空間から開くことができます。この後にopen()コールが正しく動作します。

void changePerm() 
{ 
    Process chperm; 
    try { 
     chperm=Runtime.getRuntime().exec("su"); 


    DataOutputStream os = 
      new DataOutputStream(chperm.getOutputStream()); 
     os.writeBytes("chmod 777 /dev/radio\n"); 
     os.flush(); 

     os.writeBytes("exit\n"); 
     os.flush(); 

      chperm.waitFor(); 

} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
} 

これを他のノードでテストしました。だから、ラジオのためにもうまくいくはずです。よろしくお願いします。ありがとう

+0

adbシェルを使用しているものは、root権限を持っています。私があなたが提案したのは、init.rcに "chmod 777/dev/radio0"というコマンドを置くことです。これは一時的な修正です。 – trans1st0r

+0

init.rcの変更を有効にするには、アンドロイドを再コンパイルして、それを処理する必要があります –

+0

この場合、デフォルトでルート権限がある場合、デバイス上にsuが存在しない可能性があります。その後、第1の方法(suを除く) –

関連する問題