2-安卓底層-java實(shí)現(xiàn)調(diào)用linux系統(tǒng)調(diào)用

java實(shí)現(xiàn)調(diào)用linux系統(tǒng)調(diào)用流程:

java --》 jni ---》 driver

java 實(shí)現(xiàn)的是native方法

jni 實(shí)現(xiàn)的是調(diào)用linux 系統(tǒng)調(diào)用

java_open = method結(jié)構(gòu)體 ==> Jopen == jni里調(diào)用 => open(系統(tǒng)調(diào)用) ==> driver_open

驅(qū)動(dòng):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");

驅(qū)動(dòng):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 把模塊插入到內(nèi)核中
  • 輸出 ibo_init success 表示成功插入到內(nèi)核中

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 運(yùn)行
成功調(diào)用.PNG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末告唆,一起剝皮案震驚了整個(gè)濱河市斤寇,隨后出現(xiàn)的幾起案子诡渴,更是在濱河造成了極大的恐慌匕荸,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眠冈,死亡現(xiàn)場(chǎng)離奇詭異往扔,居然都是意外死亡澎语,警方通過(guò)查閱死者的電腦和手機(jī)途事,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尸变,“玉大人,你說(shuō)我怎么就攤上這事减俏≌倮茫” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵奏夫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我历筝,道長(zhǎng),這世上最難降的妖魔是什么梳猪? 我笑而不...
    開(kāi)封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任麻削,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碟婆。我一直安慰自己电抚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布竖共。 她就那樣靜靜地躺著,像睡著了一般公给。 火紅的嫁衣襯著肌膚如雪借帘。 梳的紋絲不亂的頭發(fā)上淌铐,一...
    開(kāi)封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天肺然,我揣著相機(jī)與錄音,去河邊找鬼际起。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吐葱,可吹牛的內(nèi)容都是我干的街望。 我是一名探鬼主播弟跑,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灾前,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼孟辑!你這毒婦竟也來(lái)了哎甲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炭玫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后喝噪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體础嫡,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酝惧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年榴鼎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晚唇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巫财。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哩陕,死狀恐怖平项,靈堂內(nèi)的尸體忽然破棺而出赫舒,到底是詐尸還是另有隱情,我是刑警寧澤接癌,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站扣讼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏椭符。R本人自食惡果不足惜荔燎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一销钝、第九天 我趴在偏房一處隱蔽的房頂上張望有咨。 院中可真熱鬧,春花似錦蒸健、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)橡娄。三九已至,卻和暖如春癣籽,著一層夾襖步出監(jiān)牢的瞬間挽唉,已是汗流浹背筷狼。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工瓶籽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塑顺。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像俏险,于是被迫代替她去往敵國(guó)和親严拒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竖独,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容