其他分享
首页 > 其他分享> > [tiny4412][干货]第三篇:JNI无法正确操控driver

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

作者:互联网

##问题: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的程序员,不入门;不会点灯的程序员,不浪漫。

 

 

标签:leds,shell,driver,26,dev,tiny4412,JNI,root
来源: https://blog.csdn.net/baidu_36250852/article/details/120497696