[tiny4412][干货]第三篇:JNI无法正确操控driver

在tiny4412开发板上,JNI尝试操作LED驱动失败,打开/dev/leds返回错误。问题在于设备节点权限仅限root用户读写。通过修改权限为777后,JNI能成功打开并控制LED,解决了问题。
摘要由CSDN通过智能技术生成

##问题:JNI无法正确操控driver

书接上回,开发板子上已经正确加载了led ko文件,JNI需要操控的/dev/leds设备节点也有了:

shell@tiny4412:/ #
shell@tiny4412:/ # cat /proc/modules | grep led
leds_4412 1587 0 - Live 0x00000000
shell@tiny4412:/ #
shell@tiny4412:/ #
shell@tiny4412:/ #
shell@tiny4412:/ # ls -l /dev/leds
crw------- root     root     248,   0 2021-09-26 13:15 leds
shell@tiny4412:/ #
 

然后Android studio 开始运输 LED APP, 该APP 通过JNI 调用的led ko,如图:

点击ok, 开发板子上出现了LED APP 界面, 有的激动了。

点击LED 按键,what? LED 没有变亮!?

这不可能啊, 怎么会有bug?

不死心,继续狂点,现实就是这么残酷。

正如川普所说: this is life.

好吧,看logcat:

 

09-26 13:29:15.314  23997-23997/com.thisway.app_0001_leddemo D/LEDDemo﹕ native ledOpen : -1
....

好吧,直接打开失败了。

连大门都没进去,怎么能进入到led ko家的客厅呢?

# 程序的惯例:debug

09-26 13:29:15.314  23997-23997/com.thisway.app_0001_leddemo D/LEDDemo﹕ native ledOpen : -1

这个log对应的代码:

jint ledOpen(JNIEnv *env, jobject cls)
{
    fd = open("/dev/leds", O_RDWR);
    __android_log_print(ANDROID_LOG_DEBUG, "LEDDemo", "native ledOpen : %d", fd);
    if (fd >= 0)
        return 0;
    else
        return -1;
}

也就是说打开/dev/leds失败,但是上面说了,/dev/leds明明就在啊。

见或不见,她就在那里,不悲不喜。

shell@tiny4412:/ # ls -l /dev/leds
crw------- root     root     248,   0 2021-09-26 13:15 leds
shell@tiny4412:/ #
 

只因在人群中又多开了一眼,O_RDWR 可读可写打开,但是这个节点的属性:

 crw------- root     root     248,   0 2021-09-26 13:15 leds

只有root 用户才有rw 属性。

眼前一道光闪过,索性:

shell@tiny4412:/ # chmod 777 /dev/leds
shell@tiny4412:/ #
 

好吧,我急了,给你全部的自由。

再来:

09-26 13:53:36.694    5664-5664/com.thisway.app_0001_leddemo D/LEDDemo﹕ native ledOpen : 22

打开成功, 22就是fd。

再次点击LED APP的checkbox, 可以正常控制LED的点亮了。

同时,我内心的程序员之光也被点亮了,bug的黑暗被驱散。

一股小学生的自豪感油然而生。

god 说:不会hello world的程序员,不入门;不会点灯的程序员,不浪漫。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

change_fate_vs_god

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值