[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