android java层直接和kernel交互的最快的方法

 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;

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

 

 

原创文章,如转载请注明出处

 

你可能感兴趣的:(android java层直接和kernel交互的最快的方法)