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;
//////////////////////////////////////////////////////