理解JNI

JNI,是Java Native Interface的缩写
· Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。
· Native程序中的函数可以调用Java层的函数,也就是在C/C++程序中可以调用Java的函数。

互调过程
java做的事

· 加载对应的JNI库。
· 声明由关键字native修饰的函数。

JNI做的事

. JNI层必须实现为动态库的形式,这样Java虚拟机才能加载它并调用它的函数。
. 注册JNI函数--之意就是将Java层的native函数和JNI层对应的实现函数关联起来
. 数据类型转换
.JNIEnv通过调用CallVoidMethod,CallIntMethod等调用Java对象

一、注册JNI函数

1、静态注册

· 先编写Java代码,然后编译生成.class文件。
· 使用Java的工具程序javah,如javah–o output packagename.classname ,这样它会生成一个叫output.h 的JNI层头文件。其中packagename.classname是Java代码编译后的class文件,而在生成的output.h文件里,声明了对应的JNI层函数,只要实现里面的函数即可。
关联关系,其实就是保存JNI层函数的函数指针。以后再调用native_init函数时,直接使用这个函数指针就可以了,当然这项工作是由虚拟机完成的。

2、动态注册

动态注册的工作,只用两个函数就能完成
.jclass clazz = (env)->FindClass(env, className);
. //调用JNIEnv的RegisterNatives函数,注册关联关系。
(
env)->RegisterNatives(env, clazz, gMethods,numMethods);

当Java层通过System.loadLibrary加载完JNI动态库后,紧接着会查找该库中一个叫JNI_OnLoad的函数,如果有,就调用它,而动态注册的工作就是在这里完成的。

二、数据类型转换

在Java中调用native函数传递的参数是Java数据类型,那么这些参数类型到了JNI层会变成什么呢?
Java数据类型分为基本数据类型和引用数据类型两种

基本类型对照图
引用类型对照图

三、JNIEnv介绍

JNIEnv实际上就是提供了一些JNI系统函数。通过这些函数可以做到:
· 调用Java的函数。
· 操作jobject对象等很多事情。

1、jfieldID 和jmethodID的介绍

在JNI规则中用jfieldID 和jmethodID 来表示Java类的成员变量和成员函数通过JNIEnv的下面两个函数可以得到:
jfieldID GetFieldID(jclass clazz,const char*name, const char sig);
jmethodID GetMethodID(jclass clazz, const char
name,const char *sig);

2、使用jfieldID和jmethodID

JNIEnv通过调用CallVoidMethod,CallIntMethod、CallStatic等再把jobject、jMethodID和对应参数传进去,JNI层就能够调用Java对象的函数了

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

推荐阅读更多精彩内容

  • 此文章为《深入理解Android卷 I》的读书笔记,笔者已经完成了卷一的第一遍阅读,第一遍时写下了一些笔记,现在开...
    pokerWu阅读 1,346评论 0 6
  • 以前把做足充分的准备放在做事的第一位,现在如果让我来排序,我更倾向于先去着手去做,迈出那一步,因为计划追不...
    阿啦阅读 226评论 0 0
  • 今天大概是我上大学以来双休日起的最早的一次了,北京时间7:58,嗯。一直以来我的双休日有半天是睡过的,(双休日从不...
    妤沉阅读 180评论 0 0
  • 正当防卫刑法定义: “为了使国家、公共利益、本人或者他人的人身、财产和其他权利免受正在进行的不法侵害,而采取的制止...
    林中草Amy阅读 335评论 0 0