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;
//////////////////////////////////////////////////////
原创文章,如转载请注明出处。