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就太麻烦了,希望有做过这类经验的人给点提示;

参考技术A 首先触摸屏驱动一般在你系统加载的时候,device 和driver 应该都是匹配成功的。
我不知道你的操作有没有错误,给你建议是:
你在下ioctl 的时候,底层必须有对应的ioctl cmd 支持,如果你没有对应的command 支持,你下过去肯定是没有用的
还有内核和user 层是不能直接进行互相访问的,两个函数可以解决这个问题;copy_from_user 、copy_to_user 。
还有只要你的触摸屏已经可以工作了,说明你的驱动是没有问题的。

Android中JNI的使用方法

技术分享

可以看到Android上层的ApplicationApplicationFramework都是使用Java编写,底层包括系统和使用众多的LIiraries都是C/C++编写的。

所以上层Java要调用底层的C/C++函数库必须通过JavaJNI来实现。

    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触摸屏设备的主要内容,如果未能解决你的问题,请参考以下文章

Android JNI C++读写本地文件

Android通过jni调用本地c/c++接口方法总结

基于Eclipse的Android JNI层測试应用开发过程记录

STM32F10x_模拟I2C读写_硬件I2C读写

Android 5.x SEAndroid/SElinux内核节点的读写权限学习笔记

Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用