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

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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
??????? 要达到的目的: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目录,它里面有一些例子,可以参考这些例子来写我们自已的模块。 1、 source文件夹下,新建“LEDSJNI”文件夹。 2、 Source/LEDSJNI/jni/目录下,新建“vib-jni.c” vib-jni.c文件 #include string.h #include jni.h #include fcntl.h /*包括文件操作,如open() read() close() write()等*/ //----for output the debug log message #include android/log.h #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; } 3、相同目录下的新建Android.mk如下 Android.mk文件 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := vib-jni LOCAL_SRC_FILES := vib-jni.c LOCAL_CFLAGS := -Werror LOCAL_LDLIBS := -llog -lGLESv2 //__android_log_print 函数 include $(BUILD_SHARED_LIBRARY) 可以看到,主要是修改LOCAL_SRC_FILES指向源文件的名称! 还有一点很重要,如果要使用调试LOG 打印

文档评论(0)

***** + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档