1. 程式人生 > >android java層直接和kernel互動的最快的方法

android java層直接和kernel互動的最快的方法

http://blog.csdn.net/zengkexu/article/details/8805339

 android java 和kernel 的互動方式

 按照常規的要通過JNI實現, 然後jni 呼叫HAL的IOCTL ,或者類似Vold 中建立netlink 的方式和kernel互動。

實際上這不是一種高效的方式。這樣在時間緊迫的情況下,如果您的程式中 java只是要主動和kernel互動的,獲取一些資訊,或者寫入一些,那麼可以完全採用如下的方法:

首先驅動隨便實現一個的節點:

// sys/class/mynode/mydev/driver_level

static struct class *driver_class = NULL;
static struct device *driver_dev = NULL;


unsigned int  _level=0xff;

static ssize_t driver_level_show(struct device *dev,
  struct device_attribute *attr, char *buf)
{

//  獲取驅動的值

 return sprintf(buf, "%u\n",  _level);
}

static ssize_t driver_level_store(struct device *dev,
  struct device_attribute *attr, const char *buf, size_t size)  
{
int value = simple_strtoul(buf, NULL, 0);
    _level=value;
     // set value

  //做需要的事情
   return size;
}

static DEVICE_ATTR(driver_level, 0666, driver_level_show, driver_level_store);

static int __init driver_init(void)
{
    int ret = 0, err = 0;


    driver_class = class_create(THIS_MODULE, "mynode");
    if (IS_ERR(driver_class)) {
       return 0;
    }
    driver_dev = device_create(driver_class, NULL, 0, 0,"mydev");
    if(NULL == driver_dev){
       return 0;
    }
 device_create_file(driver_dev, &dev_attr_driver_level); 

    return 0;
}

static void __exit driver_exit(void)
{
       device_remove_file(driver_dev, &driver_level); 
       device_unregister(driver_dev);
      if(driver_class!=NULL)
        class_destroy(driver_class);
}
 
module_init(driver_init);
module_exit(driver_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("xzk>");
MODULE_DESCRIPTION("driver value");

//------------------------------------------------------

java 層操作

    try {
   
     FileOutputStream fops = new FileOutputStream("sys/class/mynode/mydev/driver_level");
     fops.write("1".getBytes()); //例如往驅動寫入1 
     fops.flush();
     fops.close();
    } catch (IOException e) {
    e.printStackTrace();
   }
// 這個函式就會呼叫driver_level_store 函式。

那麼同樣讀取驅動的值:

 try {
            FileInputStream fis = new FileInputStream(
                    "sys/class/mynode/mydev/driver_level");
            InputStreamReader isr = new InputStreamReader(fis);
            BufferedReader br = new BufferedReader(isr, 4096);

           StringBuilder buffer = new StringBuilder();
           String ch = null;
            while ((ch = br.readLine()) != null)
           {
                buffer.append(ch);
                buffer.append("\r\n");
          }
             br.close();
        } catch (FileNotFoundException e) {
        
            //Slog.i(TAG, "No file found");
        } catch (IOException e) {
             //Slog.w(TAG, "Error reading ", e);
        }

//  這裡就呼叫kernel  driver_level_show,把讀取的內容放到StringBuilder buffer 中。 當然在這裡只有一個字元,所以你也可以直接讀取位元組就好了。

當然在如上 java中,還需要匯入相關的包:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;

//////////////////////////////////////////////////////