Android:无法在JNI实现中打开设备文件

时间:2012-05-07 10:37:56

标签: android c++ android-ndk java-native-interface android-framework

我已经使用Code Aurora的FM Radio代码并与我的Android Gingerbread代码库合并。

FM应用程序框架尝试使用JNI访问fm无线电设备(/ dev / radio),JNI在名为android_hardware_fm.cpp的文件中实现。此文件中有一个函数,它尝试在读/写模式下使用open()获取设备节点的文件描述符。但是,调用失败,错误代码为-13:权限被拒绝。

我还制作了一个小的C可执行文件,试图打开/ dev / radio文件(在RDWR模式下),打印其fd并关闭它。它从目标系统中的/ system / bin运行并显示有效的fd。

顺便说一下,JNI实现是android核心库的一部分。它位于frameworks / base / core / jni中,并作为libandroid_runtime.so的一部分进行编译

任何想法/解决方案?提前谢谢。

1 个答案:

答案 0 :(得分:1)

显然,您没有权限从用户空间打开设备。在第二种情况下,当您从终端运行可执行文件时,您可能拥有权限,因为您在运行可执行文件之前已完成su

对于你的问题,可以做两件事。

1)从terimnal更改节点的权限。

涉及的步骤:

  • 打开终端(adb shell

  • 执行su(为了做到这一点,您的设备必须植根)

  • 在终端中执行chmod 777 /dev/radio

完成此操作后,您的无线电节点具有用户读取和写入的适当权限。所以你现在可以进行open()通话,它会起作用。

2)通过调用以下函数 - changePerm(),您可以通过编程方式实现此目的(假设您的设备已植根并且su正在您的设备上运行)。这是我编写的一个小函数,它将更改设备节点的权限,或者更改任何没有用户访问权限的系统文件。获得权限后,您可以从用户空间打开它。 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();
}
}

我已经为其他节点测试了这个。所以它也适用于无线电。如果你遇到任何困难,请告诉我。感谢