2-安卓底层-java实现调用linux系统调用

java实现调用linux系统调用流程:

java --》 jni ---》 driver

java 实现的是native方法

jni 实现的是调用linux 系统调用

java_open = method结构体 ==> Jopen == jni里调用 => open(系统调用) ==> driver_open

驱动:ibo.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <asm/uaccess.h>
#include <asm/io.h>

#define     IBO_MAJOR   505
#define     IBO_MINOR   0
#define     IBO_NUM     1
#define     IBO_NAME    "ibo"
#define     CLS_NAME    "ibo_cls"
#define     DEV_NAME    "ibo"

dev_t devno;
struct cdev ibo_cdev;
struct class * cls;

static int ibo_open(struct inode *inode,struct file *filp){
    printk("ibo_open success\n");
    return 0;
}

static int ibo_release(struct inode *inode,struct file *filp){
    printk("ibo_release success\n");
    return 0;
}

static long ibo_ioctl(struct file *filp,unsigned int cmd,unsigned long arg){
    printk("ibo_ioctl success %d\n",cmd);
    return 0;
}

struct file_operations ibo_fops={
     .owner          = THIS_MODULE,
     .open           = ibo_open,
     .release        = ibo_release,
     .unlocked_ioctl = ibo_ioctl,
};

static int ibo_init(void){
    int ret;
    devno = MKDEV(IBO_MAJOR,IBO_MINOR);
    ret = register_chrdev_region(devno,IBO_NUM,IBO_NAME);
    if (ret < 0){
        return -EFAULT;
    }

    cdev_init(&ibo_cdev,&ibo_fops);
    ibo_cdev.owner = THIS_MODULE;

    cdev_add(&ibo_cdev,devno,IBO_NUM);

    cls = class_create(THIS_MODULE,CLS_NAME);
    if (IS_ERR(cls)){
        printk("class_create fail!!!\n");
        return -EFAULT;
    }

    device_create(cls,NULL,devno,NULL,DEV_NAME);

    printk("ibo_init success\n");
    return 0;
}

static void ibo_exit(void){
    device_destroy(cls,devno);
    class_destroy(cls);
    cdev_del(&ibo_cdev);
    unregister_chrdev_region(devno,IBO_NUM);

    printk("ibo_exit success\n");
    return;
}

module_init(ibo_init);
module_exit(ibo_exit);

MODULE_LICENSE("GPL");

驱动:Makefile

ifeq ($(KERNELRELEASE),)

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) 

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*

.PHONY: modules clean

else
    obj-m := ibo.o
endif
1.输入make编译生成 .ko 文件
2.sudo insmod ibo.ko 把模块插入到内核中
  • 输出 ibo_init success 表示成功插入到内核中

JAVA : Ibo.java

class Ibo{
    static{
        System.loadLibrary("native");
    }
    private native void open();
    private native void ioctl(int cmd);
    private native void release();


    public static void main(String[] args) {

        Ibo m=new Ibo();
        m.open();
        m.ioctl(525);
        m.release();
    }
}
3.javac Ibo.java生成 class文件
4.javah Ibo生成 h文件

JNI : native.c

#include <jni.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/ioctl.h>

int fd;

void Jopen(JNIEnv *env,jobject obj){
    fd = open("/dev/ibo",O_RDWR);
    return;
}
void Jioctl(JNIEnv *env,jobject obj,jint cmd){
    ioctl(fd,cmd);
    return;
}
void Jrelease(JNIEnv *env,jobject obj){
    close(fd);
    return;
}

JNINativeMethod methods[]={
    "open","()V",(void *)Jopen,
    "ioctl","(I)V",(void *)Jioctl,
    "release","()V",(void *)Jrelease,
};

JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved){
    JNIEnv *env;
    jclass cls;

    system("sudo chmod 777 /dev/ibo");

    (*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2);
    if(env == NULL) return JNI_ERR;

    cls = (*env)->FindClass(env, "Ibo");
    if(cls == NULL) return JNI_ERR;

    (*env)->RegisterNatives(env, cls,methods, sizeof(methods)/sizeof(JNINativeMethod));

    return JNI_VERSION_1_2;
}
5.gcc -shared -fPIC native.c -o libnative.so -I /usr/lib/jvm/java-7-openjdk-amd64/include/ 编译生成 libnative.so 文件
6.export LD_LIBRARY_PATH=:
7.java Ibo 运行
成功调用.PNG
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容