Android通过JNI调用驱动程序(完全解析实例)_图文_第1页
Android通过JNI调用驱动程序(完全解析实例)_图文_第2页
Android通过JNI调用驱动程序(完全解析实例)_图文_第3页
Android通过JNI调用驱动程序(完全解析实例)_图文_第4页
Android通过JNI调用驱动程序(完全解析实例)_图文_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、分类: android 2011-06-22 13:48 251人阅读 评论(2 收藏 举报 -作者:赖玉平(Peter Lai)        要达到的目的:android系统中,用JAVA写界面程序,调用jni中间库提供的接口,去操作某个驱动节点,实现read,writer ioctl等操作!这对底层驱动开发人员是很重要的一个调试通道,也是android 系统下提供一些特殊功能接口的方法!本文前提:我们假设已经写了一个驱动程序,它是控制LED的亮灭的,并且创建了一个节点:/dev/vib,也就是通过open这个vib节点

2、,可以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 #include #include /*包括文件操作,如open( read( c

3、lose( 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 0x

4、11#define VIB_OFF 0x22int fd;jstringJava_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

5、_RDWR;/打开设备LOGE("vibClass_Init(-> fd = %d /n",fd;if(fd = -1LOGE("open device %s error /n ",DEVICE_NAME;/打印调试信息return 0;elsereturn 1;jint Java_com_auly_control_vibClass_IOCTLVIB( JNIEnv* env, jobject thiz, jint controlcode int CTLCODE = controlcode;LOGE("IOCTLVIB( = %x -vi

6、bClass_IOCTLVIB /n",CTLCODE;switch(CTLCODEcase 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-dirinclude $(CLEAR_VARSLOC

7、AL_MODULE := vib-jniLOCAL_SRC_FILES := vib-jni.cLOCAL_CFLAGS := -WerrorLOCAL_LDLIBS := -llog -lGLESv2 /_android_log_print 函数include $(BUILD_SHARED_LIBRARY可以看到,主要是修改LOCAL_SRC_FILES指向源文件的名称!还有一点很重要,如果要使用调试LOG 打印,也就是_android_log_print 函数。要在LOCAL_LDLIBS中添加-llog,如上面的Android.mk所示。4、编译JNI模块 #cd /home/works

8、pace/android-ndk-r4b/sources/LEDSJNI进到刚才写的JNI目录 #ndk-build编译JNI,编译成功后,会在LEDSJNI文件夹下生成libs和obj两个文件夹,并在LEDSJNI/libs/armeabi下得到目标文件libvib-jni.so(目前LEDSJNI文件夹只有3个目录jni,libs,obj)二、JAVA程序1、Eclipse新建工程拷贝LEDSJNI目录到Windows下,例如C盘下。然后在它里面新建Eclipse 工程。新键工程后,如果出现如下错误:ERROR: Unable to open class file C:/LEDS

9、JNI/gen/com/auly/control/R.java: No such file or directory解决方法如下:对着该工程鼠标右键 bulid path configure build pathjava build pathorder and Export 把里面的android 2.1勾上,Build project,就OK了然后 Run as > Android application,就会出现android的模拟器了,里面跑个helloworld出来。2、加入button和文本输出程序到上面为止代码是ADT自动生成的,似乎与我们一点关系也没有。那我们来改

10、一下代码,因为我们调用JNI接口是为了访问驱动程序操作硬件的,例如写,读,打开LED,关闭LED等等,由按钮触发的动作。第一步是,增加两个Button,在main.xml里描述一下:打开spanRes > layout> main.xml 文件span"1.0"/*这表示需要一个唯一的UID来作为Button的ID,它的引用名是led_on。*/android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="

11、string/LEDon">/*表示这个按钮的文本是来源于另一个资源描述文件strings.xml里的文:字资源LEDon */"+id/led_off"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="string/LEDoff">实际代码中,把注释去掉,否则编译不过的。3、加入输出字符串资源工程 > values > strings.xml 文件修改如下&qu

12、ot;1.0" encoding="utf-8"?>"hello" >Led 控制程序 "app_name" >LEDAPP "LEDon" > 打开 LED "LEDoff" > 关闭 LED 上面的”打开LED”等资源,就是用在按钮上显示出来的字符串经过上面的修改,现在程序界面上,已经有如下效果了鼠标右键工程名>Run as > Android application 运行程序。4、加入按钮对应的动作“打开LED”按扭:调用JNI的IOCT

13、LVIB(VIB_ON;“GL10.GL_NICEST;按钮:调用JNI的 IOCTLVIB(VIB_OFF;操作:在* see/*定义头文件*/* 定义变量 */public static/ Sets the current view port to the new size.static final int VIB_OFF = 0x22;vibClass mvibClass;/*定义类gl.glMatrixModepublic void onCreate(Bundle savedInstanceState super.onCreate(savedInstanceState;gl.glLoa

14、dIdentity- */ / Calculate the aspect ratio of the window声明类*/mvibClass.Init(; /调用(float width / (float height,0.1f, 100.0f;按钮:打开LED- */ gl.glMatrixMode(GL10.GL_MODELVIEW;/ ,就是在main.xmlgl.glLoadIdentity(;/ OpenGL docs.Fullscreen*/ mvibClass.IOCTLVIB(VIB_ON; requestWindowFeature/*-按钮:关闭LED- */ /*声明按钮,

15、id main.xml里有定义*/btn2.setOnClickListener(new View.OnClickListener( Previous tutorial was all about setting up the GLSurfaceView. Be sure to read it beacuse it's a really importent one to be able to continue.*/mvibClass.IOCTLVIB(VIB_OFF;如果在保存时遇到说 save problems,无法保存,请先复制上面的代码,然后,关闭To define the ve

16、rtices on android we define them as a float array that we put into a byte buffer to gain better performance. Look at the image to the right and the code below to match the vertices marked on the image to the code. Eclipse 的不稳定造成的。 5、添加类鼠标右键填参数:Finish后,在-1.0f, -1.0f, 0.0f, / 1, Bottom LeftvibClass.ja

17、va修改如下/*Class for Vibrator -peter*/public class/ a float is 4 bytes, therefore we multiply the number if vertices with 4.static System.loadLibrary("vib-jni"vbb.order(ByteOrder.nativeOrder(;加载 JNI 库 */ /* 声明 函数 */ static/ Enabled the vertex buffer for writing and to be used during rendering

18、.gl.glEnableClientState(GL10.GL_VERTEX_ARRAY;/ OpenGL docs.里面的jstring Java_com_auly_control_vibClass_stringFromJNI( JNIEnv* env,jobject thiz */gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer; / OpenGL docs.When you are done with the buffer don't forget to disable it. Init(;/*初始化函数,对应于JNI里面的jint Java_com_auly_control_vibClass_Init( JNIEnv* env */public static native int IOCTLVIB(int controlcode;/*IO CTRL 接口* 对应于JNI里的jint Java_com_auly_control_vibClass_IOCTLVIB( JNIEnv* env, jobject thiz, jint controlcode */三、 编译

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论