ioctl返回失败,驱动中ioctl没调问题解决

来源:互联网 发布:golang redis expire 编辑:程序博客网 时间:2024/06/08 04:42

在移植A64 jni库时,遇到ioctl一直返回失败,驱动加打印证明根本没调到驱动ioctl方法,自己写个测试demo,证明ioctl控制是没问题的,经网络资源学习以及文件系统代码中加log,证明当跑测试demo时,文件系统默认调用了unlock_ioctl,跑jni库时却走了另一条路,在文件一级一级调用时就已经调到compat_ioctl了,而驱动中并没有注册compat_ioctl。说到这里,基本可以猜出个大概了,由于,A64内核跑的是64位,而java上层(虚拟机之上)如果跑的是32位代码,就会调用compat_ioctl.  这正是unlock_ioctl以及compat_ioctl同事存在的意义。

解决办法:

1.将驱动中的ioctl方法同时注册为campat_ioctl 和 unlock_iocrtl,这样也保证了它的可移植性,不再会因为同样的问题由于找不到compat_ioctl而返回错误给上层了。

2、由于我的jni库是在eclipse上编译,直接联机调试的,所以在源码里面编译一下一样可以解决这个问题,原因猜想是因为eclipse ndk用的是32位的,我试过库确实是64位的,唯一不同的就是 apk。结合安卓虚拟机的意义,猜想用32位ndk编出了这个apk,虽然能跑,但是出现了这样的问题,未经证实,但是觉得应该是这样。