Android驱动运用JNI调用

                                         Android驱动运用JNI调用   学习Android驱动是一个漫长的进程,当然你也可以说有了Linux设备驱动开发阅历学习Android驱动是很简单的,呵呵,的却如此,终究Android内核是跑在linux内核上,Android的运用调用的其实是linux驱动。Android Application调用Linux http://www.1111kp.info/linked/20130422.do 驱动可以这么说有两种办法,也便是两种处置的流程。   Android运用层调用Linux驱动的办法:   第一,通过在Android内核源码(不是linux内核源码)中添加HAL层、JNI层、打开系统效力,这是一个比较杂乱的进程,许多标准的设备都选用这种办法描写,比方说wifi、gps、sensor等,这种调用进程看起来比较标准,可是如果作为第三方开发就会很费事,HAL层、JNI层,系统效力层,每层都需要编译Android内核源码,这样就会延长了商品的开发周期;第二,通过配备NDK环境,在NDK环境中直接编写JNI层,然后在Android运用层中添加类,加载JNI库即可调用设备的驱动。   如今我们以Tiny210上的LED驱动作为比方说明怎样运用NDK环境编写JNI库来调用设备的驱动程序。   一、首先是编写linux驱动程序,: 1、源码:linux-2.6.36-android\drivers\char\tiny210_leds.c 2、批改其时目录(linux-2.6.36-android\drivers\char)的kconfig,添加如下内容: config TINY210_LEDS  tristate "LED Support for Tiny210 GPIO LEDs"  depends on CPU  S5PV210  default y  help    This option enables support for LEDs connected to GPIO lines    on Tiny210 boards. 3、批改其时目录(linux-2.6.36-android\drivers\char)下的makefile文件,添加如下内容: obj-$(CONFIG_TINY210_LEDS)  = tiny210_leds.o 4、到源码目录实行make menuconfig 配备LED驱动编译进内核,系统起来就加载驱动 5、实行 make 生成zImage镜像文件 二、 从头运用刚刚编译好的zImage烧写Android系统,系统起来往后通过adb查看Android系统加载的驱动程序 #ls /dev  可以看到系统加载的驱动,(leds) 批改init.rc加载的驱动的读写权限 chmod 0666 /dev/leds 这样JNI层才可以翻开这个设备 三、编写JNI文件 在android工程目录下新建文件jni,然后添加文件ledjni.c,内容如下: #include  #include  #include  #define DEV_NAME "/dev/leds" jstring Java_com_hellojnipwzh_HardwareControlClass_stringFromJNI( JNIEnv* env,                                                   jobject thiz ) {     return (*env)->NewStringUTF(env, "Hello from JNI !"); } jint Java_com_hellojnipwzh_HardwareControlClass_Init(JNIEnv *env,           jobject thiz) {  int fd=open(DEV_NAME,O_RDWR);  return fd; } jint Java_com_hellojnipwzh_HardwareControlClass_IOCTLLED(JNIEnv *env,           jobject thiz,           jint ledid,           jint controlcode,           jint fd) {  int CTLCODE = controlcode;  ioctl(fd,controlcode,ledid);  return 0; } 说明:“Java_com_hellojnipwzh_HardwareControlClass_IOCTLLED”,在工程中添加JNI类时,运用com.hellojnipwzh作为packets name,HardwareControlClass这个作为class name  ,IOCTLLED(int id,int code,int fd)作为调用的接口函数,类成员。 添加脚本Android.mk,内容如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE    := ledjni LOCAL_SRC_FILES := ledjni.c include $(BUILD_SHARED_LIBRARY) 运用Cygwin东西,配备好NDK环境,添加NDK环境到系统变量中,然后进到jni目录,进行 #ndk-build 这样就会在android工程的libs目录下的armeabi目录下生成ledjni.so 这样JNI库现已结束了,接下来便是添加类来调用JNI库 四、JNI类 在Android工程中添加一个类,包名:com.hellojnipwzh 类名:HardwareControlClass,具体内容如下: package com.hellojnipwzh; import android.util.Log; public class HardwareControlClass {    static public native String stringFromJNI();  static public native int Init();  static public native int IOCTLLED(int ledID, int ledState ,int fd);    static {      try {       System.loadLibrary("ledjni");      } catch (UnsatisfiedLinkError e) {          Log.d("HardwareControler", "HardwareControler ibrary not found!");      }  } } 五、接下来便是在Android运用层代码中通过类来访问驱动了 package com.hellojnipwzh; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.TextView; public class HelloJniPwzh extends Activity {  int fd = -1;  TextView tv;  @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_hello_jni_pwzh);         fd = HardwareControlClass.Init();   if (-1 == fd)    Log.d("JNI", "open device error!");       tv = (TextView)findViewById(R.id.tvid);   String tstr = "ssss";   tstr = HardwareControlClass.stringFromJNI();   tv.setText(tstr);  }  @Override  public boolean onCreateOptionsMenu(Menu menu) {   // Inflate the menu; this adds items to the action bar if it is present.   getMenuInflater().inflate(R.menu.activity_hello_jni_pwzh, menu);   return true;  }    public void onclickLedOn1(View v)  {   if (fd != -1)    HardwareControlClass.IOCTLLED(1, 1, fd);  }  public void onclickLedOff1(View v)  {   if (fd != -1)    HardwareControlClass.IOCTLLED(1, 0, fd);  }    public void onclickLedOn2(View v)  {   if (fd != -1)    HardwareControlClass.IOCTLLED(2, 1, fd);  }  public void onclickLedOff2(View v)  {   if (fd != -1)    HardwareControlClass.IOCTLLED(2, 0, fd);  }    public void onclickLedOn3(View v)  {   if (fd != -1)    HardwareControlClass.IOCTLLED(3, 1, fd);  }  public void onclickLedOff3(View v)  {   if (fd != -1)    HardwareControlClass.IOCTLLED(3, 0, fd);  }    public void onclickLedOn4(View v)  {   if (fd != -1)    HardwareControlClass.IOCTLLED(4, 1, fd);  }  public void onclickLedOff4(View v)  {   if (fd != -1)    HardwareControlClass.IOCTLLED(4, 0, fd);  } } 至此JNI的调用进程也现已结束,接下来便是将Android软件安装到Tiny210上,然后点击下按钮,你就会发现你可以通过Android软件来控制Linux驱动程序了。 http://www.superkp111.com/linked/20130422.do 
posted @ 2013-04-23 02:38  chinadiy197601  阅读(398)  评论(0编辑  收藏  举报