gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:29 30 4
gpt4 key购买 nike

我采用了 Code Aurora 的 FM Radio 代码并与我的 Android Gingerbread 代码库合并。

FM 应用程序框架尝试使用 JNI 访问调频 radio 设备 (/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 的一部分

有什么想法/解决方案吗?提前致谢。

最佳答案

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

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

1) 从终端更改节点的权限。

涉及的步骤:

  • 打开终端(adb shell)

  • 执行 su(为此,您的设备必须已 root)

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

完成此操作后,您的 radio 节点将具有适当的权限供用户读写。所以您现在可以执行 open() 调用,它会起作用。

2) 您可以通过调用以下函数 - changePerm() 以编程方式实现此目的(假设您的设备已获得 root 权限并且 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();
}
}

我已经对其他节点进行了测试。所以它也应该适用于 radio 。如果您遇到任何困难,请告诉我。谢谢

关于Android:无法在 JNI 实现中打开设备文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10480594/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com