Android通过JNI调用驱动程序(完全解析实例)

--作者:赖玉平(Peter Lai)[email protected]
要达到的目的:android系统中,用JAVA写界面程序,调用jni中间库提供的接口,去操作某个驱动节点,实现read,writer ioctl等操作!这对底层驱动开发人员是很重要的一个调试通道,也是android 系统下提供一些特殊功能接口的方法!
本文前提:我们假设已经写了一个驱动程序,它是控制LED的亮灭的,并且创建了一个节点:/dev/vib,也就是通过open这个vib节点,可以read/write/ioctl 操作驱动程序实现LED灯的亮灭控制,具体可以看我另一篇博文《android驱动例子(LED灯控制)
开发环境 1、ubuntu下的NDK编译环境,2、Esclips开发环境
一、编写JNI模块
当安装好NDK编译环境后,会在它的目录下找到sample目录,它里面有一些例子,可以参考这些例子来写我们自已的模块。
clip_image002Android通过JNI调用驱动程序(完全解析实例)
1、 source文件夹下,新建“LEDSJNI”文件夹。
2、 Source/LEDSJNI/jni/目录下,新建“vib-jni.c”
vib-jni.c文件
#include
#include
#include /*包括文件操作,如open() read() close() write()等*/
//----for output the debug log message
#include
#define LOG_TAG "vib-jni"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define DEVICE_NAME "/dev/vib" //device point
#define VIB_ON 0x11
#define VIB_OFF 0x22
int fd;
jstring
Java_com_auly_control_vibClass_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI--Peter for vib!");//打印字符串
}
jint
Java_com_auly_control_vibClass_Init( JNIEnv* env )
{
LOGE("vibClass_Init() \n");
fd = open(DEVICE_NAME,O_RDWR);//打开设备
LOGE("vibClass_Init()-> fd = %d \n",fd);
if(fd == -1)
{
LOGE("open device %s error \n ",DEVICE_NAME);//打印调试信息
return 0;
}
else
{
return 1;
}
}
jint
Java_com_auly_control_vibClass_IOCTLVIB( JNIEnv* env, jobject thiz, jint controlcode )
{
int CTLCODE = controlcode;
LOGE("IOCTLVIB() = %x --vibClass_IOCTLVIB \n",CTLCODE);
switch(CTLCODE)
{
case VIB_ON:
{
ioctl(fd,VIB_ON);//调用驱动程序中的ioctrl接口,把命令VIB_ON传下去,实现硬件操作
break;
}
case VIB_OFF:
{
ioctl(fd,VIB_OFF);//调用驱动程序中的ioctrl接口,把命令VIB_OFF传下去,实现硬件操作
break;
}
default:break;
}
return 1;
}
Tags: 

延伸阅读

最新评论

发表评论