1

Code Aurora の FM Radio コードを Android Gingerbread コードベースにマージしました。

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

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

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

アイデア/解決策はありますか?前もって感謝します。

4

1 に答える 1

1

明らかに、ユーザー スペースからデバイスを開く権限がありません。ターミナルから実行可能ファイルを実行している 2 番目のケースでは、おそらくsu実行可能ファイルを実行する前に実行したため、パーミッションを持っています。

ここでの問題については、2 つのことができます。

1)ノードの権限を端末から変更します。

必要な手順:

  • ターミナルを開く ( 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();
}
}

これを他のノードでテストしました。したがって、ラジオでも機能するはずです。困難に直面している場合はお知らせください。ありがとう

于 2012-05-08T04:44:06.160 に答える