Android应用通过JNI读写I2C Input触摸屏设备
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android应用通过JNI读写I2C Input触摸屏设备相关的知识,希望对你有一定的参考价值。
android上层应用通过JNI,open\read\write\close /dev/Input/event*触摸屏设备,设备接口是标准i2c,触摸屏设备已经有驱动,是标准的input输入设备驱动,获取坐标点信息是由#includ linux/i2c的读写函数得到的,硬件挂在i2c-2接口;
我在网络上找过i2c JNI,编译通过,app程序调用open应该是("dev/i2c-2)还是(dev/input/event1),input设备节点是event1;两者都return open(fileName, O_RDWR); 返回正值,在读写时出错,我认为直接引用别人的JNI函数可能有问题,read中:当我写正确的i2c地址时 res = ioctl(fileHander, I2C_SLAVE, slaveAddr); 返回错误,写错误i2c地址时ioctl通过 j = read(fileHander, bufByte, len)) != len 错误。有点感觉像是我使用open("dev/i2c-2),结果我的触摸屏是input输入设备驱动模块已经挂载占用了i2c;按这样的想法,我是该在触摸屏input驱动中添加一些怎样的ioctl( , ,) read( , ,) write( , ,)接口再通过open(dev/input/event1)后在通过ioctl( , ,) read( , ,) write( , ,)去操作触摸屏,
我想还是不要修改触摸屏驱动的,那样android的JNI就太麻烦了,希望有做过这类经验的人给点提示;
我不知道你的操作有没有错误,给你建议是:
你在下ioctl 的时候,底层必须有对应的ioctl cmd 支持,如果你没有对应的command 支持,你下过去肯定是没有用的
还有内核和user 层是不能直接进行互相访问的,两个函数可以解决这个问题;copy_from_user 、copy_to_user 。
还有只要你的触摸屏已经可以工作了,说明你的驱动是没有问题的。
Android中JNI的使用方法
可以看到Android上层的Application和ApplicationFramework都是使用Java编写,底层包括系统和使用众多的LIiraries都是C/C++编写的。
所以上层Java要调用底层的C/C++函数库必须通过Java的JNI来实现。
1、众所周知,Android的应用层的类都是以Java写的,这些Java类编译为Dex文件之后,必须靠Dalvik虚拟机( Virtual Machine)来执行。假如在执行java程序时,需要载入C&C++函数时,Dalvik虚拟机就会去加载C&C++的库,(System.loadLibrary("libName");)让java层能顺利地调用这些本地函数。需要清楚一点,这些C&C++的函数并不是在Dalvik虚拟机中运行的,所以效率和速度要比在Dalvik虚拟机中运行得快很多
Dalvik虚拟机成功加载库之后,就会自动地寻找库里面的JNI_OnLoad函数,这个函数用途如下:
(1)告诉Dalvik虚拟机此C库使用哪一个JNI版本。如果你的库里面没有写明JNI_OnLoad()函数,VM会默认该库使用最老的JNI 1.1版本。但是新版的JNI做了很多的扩充,也优化了一些内容,如果需要使用JNI的新版功能,就必须在JNI_OnLoad()函数声明JNI的版本。
因为Dalvik虚拟机加载C库时,第一件事是调用JNI_OnLoad()函数,所以我们可以在JNI_OnLoad()里面进行一些初始化工作,如注册JNI函数等等。注册本地函数,可以加快java层调用本地函数的效率。
另外:与JNI_OnLoad()函数相对应的有JNI_OnUnload()函数,当虚拟机释放该C库时,则会调用JNI_OnUnload()函数来进行善后清除动作。
项目链接:http://download.csdn.net/detail/qq_28039537/9668409
以上是关于Android应用通过JNI读写I2C Input触摸屏设备的主要内容,如果未能解决你的问题,请参考以下文章
基于Eclipse的Android JNI层測试应用开发过程记录