00:00
那讲完虚拟机站以后呢,我们来讲下一张叫做本地方法接口,这我们在PPT里边呢,也放了这个图,这个红框呢,就是我们现在要讲的这个部分,呃,这呢是咱们整个Java虚尼的整体结构的一部分,咱们还是看一下这个比较完整的一个图啊,那就可以看这个图了。行,那么前面呢,这个执行这个呃类加载此系统咱们已经讲过了,然后内存结构里边呢,咱们把这个PT寄存器还有。嗯,虚拟站这个已经讲过了,然后咱们现在呢,是跳出了运行时数据区先穿插一个内容,就是我们现在要讲的,诶这块的一个内容。啊,本地方法库啊,相关的结构,这呢涉及到本地方法接口,还有本地方法的一个库啊,Library一个调用,然后这个说清楚以后呢,咱们再回过去下一章来讲运行时数据区里边的本地方法站的问题啊,先来说清楚这个事情啊,这就我们这一章要讲的内容,整体内容呢,应该说非常的简单啊,非常的简单。好,我们来看一下这个描述,首先说一下什么是本地方法啊,简单的说一个native方法啊,Native method就是一个Java调用非Java代码的一个接口啊,这个直接翻译呢,就是本地方法的意思了,说一个native method啊,是这样的一个va方法啊,这是咱们Java生命的一个方法啊,Native呢,也是Java的一个关键字,说该方法的实现呢,是由非Java语言实现的。
01:24
比如说C语言。这个特征呢,并非是Java所特有的,许多其他的编程语言呢,也一样有这个特征机制啊,比如说我们在这个C加加当中,我们可以用ex turnn c啊来告知C加加的编译器呢,去调用一个C的函数,所以这种情况呢,是比较常见的啊,包括到目前为止呢,我们看到这个C语言现在排行榜榜上呢,也是排第二位是吧?诶它的这个这个叫什么热度还是比较高的啊,相当于呢,我们在这个Java语言当中呢,可以去调用C的这个函数啊,是这个意思,那我们本地接口啊,本地方法的接口,实际上它的作用呢,就是为了融合不同的编程语言呢,为Java所用,那初衷呢,就是诶融合C和C加加的程序。
02:05
是这样子的啊,那本地方法这呢是一个英文的描述,说这个本地方法呢,是一个Java的方法,说它的这个具体的实现呢,呃,是通过一个非Java的一个代码来实现的。诶,就是这样的一个意思了啊,那如何去定义一个本地方法呢,就是用一个native啊这个关键字呢,去修饰一下它呢,不提供任何的方法的实现题,就是我们就看不到了,有点像是我们的一个抽象方法一样。呃,但是呢,它实际上这个实现体呢,是由非Java语言来实现的,如果要用Java语言实现的,那就是一个非native的方法了,呃,这个咱们其实也都见过一些啊,比如说ctrl shift t,咱们先来看一下像object。Object。嗯,浪包下的object object里边呢,咱们有一个方法,呃,像这个get class这个方法,呃,它就是标识为叫native啊,是一个本地的方法,从形式上来看呢,它像是一个抽象方法一样,没有方法体,实际上呢,不是的哈,它是有方法体的,只不过呢,这个方法体的具体实现呢,不是咱们Java程序来实现的了啊,所以标识为叫native啊,这呢,其实主要就是我们C和C加加的这个程序啊来实现的。
03:14
嗯,这是我们说的这个情况啊,还有呢,比如我们ctrl shift t呢,看到像这个诶thread。哎,我们常见到的啊,这些结构里边啊,浪包下的这个thread啊,你看我们一进来就能看到一个,就是咱们在调这个大的方法的时候呢,去启动一个线程,那启动这个线程的时候呢,内部我们会看到这个START0这个方法的调用,这呢也是一个本地方法。诶,它的权限呢,是一个private的,他们二者呢是可以共用的,还比如说我们去set priority,去设置一个现成的优先级。哎,设置优先级的过程当中。我们看到这有一个set priority0,诶点击一下它也是一个native方法,包括呢,你看我们线程里边还有很多的这个native方法,呃,因为呢,我们说咱们在Java层面的这个线程,实际上呢,都需要转换成操作系统的本地线程,所以呢,我们需要调用到底层的这个C啊的操作,诶这就有很多的这个native方法啊,这个我们都能看得到。
04:12
行,这呢,就是我们对这个本地方法呢,大家先有一个比较直观的一个认识啊,就是使用native这个关键字来修饰的一个Java方法,我们就称为叫本地方法啊,把这个代码呢,我粘出来,哎,就也定义到了咱们这个位置上。那定义到这个位置上,哎,大家能看到,哎,咱们这个第六章里边啊,引入到这样的一个程序啊,这呢是我们一个Java中的一个正常的一个类。这个类里边呢,大家你会发现我们的每一个方法呢,都用了native关键字呢来修饰,那每一个方法呢,都没有方法体了。哎,都没有方法体了,这呢就意味着它是本地方法了啊,这个注意咱们这时候的这个本地方法呀,它不意味着是一个抽象方法啊。或者换句话说呢,这个native跟我们这个abstract,咱们说叫抽象的啊,这两个关键字呢,还是不可以共用的。
05:03
啊,这个一定要注意,就是native的话呢,它表明了咱们调用的是一个本地方法,呃,是它有方法体,只不过呢,我们不是用Java实现的,而abstract呢,表示的是没有方法体,它俩呢是矛盾的啊。这要注意,另外的话呢,你会发现咱们native呢,跟这个权限,比如public呀,这个这是默认权限的,还有这个private写到这里了啊,他们这都是可以算是共同存在的啊,你看我们这个关键字呢,其实它这个位置呢,也相对来讲是比较灵活的。哎,这样啊,就是private啊,缺型的protect public等等这个权限呢,不同的权限,这个修饰服务都可以跟我们public,呃,Native呢是这个共用啊,而且呢,Native跟static呢也可以共用啊,那它们综合在一起呢,就是各自表示各自的意义,这呢表示是非Java语言实现的,它表示呢,直接通过类呢可以进行调用,诶这个呢,我们加了SNE呢,就表示呢,我我们这还是一个同步的方法,嗯,就是当这几个关键字能共用呢,就是兼具他们各自的这个特征。
06:10
诶,我们一个native的方法呢,还可以去抛出异常,哎,这都是可以的啊,都是能够满足我们这个要求的啊,行,这是我们说的这个方法的一个定义,需要注意的就是它不能够用abstract呢去修饰,哎,这个咱们说过了啊。好,下个问题,当我们清楚这个native方法是怎么回事了以后,我们再来问第二个问题,说为什么要使用native方法呢?我们为什么要在Java程序当中来定义调用其他语言的这个呃方法呢?那这呢,我们就来看一看这个问题啊,说Java使用起来呢非常的方便,然而呢,有些层次的任务呢,我们Java实现呢就不容易了,或者说呢,我们对程序的效率很在意的时候呢,这个问题就来了。问题就来了,诶我们为什么要在Java里边去使用C或者C加加的程序呢?诶我们这呢是分了三个原因来说,诶与Java环境外的交互,哎与操作系统的交互,诶science Java这样的三个情况来说明。
07:13
啊,简单来说呢,大家回忆一下,咱们Java语言呢,可以理解成是诞生于1995年96年的一月份啊,发布的是JDK1.0,而当时呢,是咱们这个C语言或者叫C加加呢横行的时候。啊,这个C语言C加加在当时这个是鼎盛的这个时期啊,这个市场占有率非常高啊,那作为我们这个Java程序来讲还比较弱小,你如果想立足的话呢,诶是不是尽可能的应该融合这个跟这个C或C加呢,要要有比较好的一个融合关系,是吧?诶你能借助它呢,才能够起来,包括呢,像咱们说还有一门语言叫javascript。啊,其实原来它不叫JS啊,呃,那他把名字改成javascript,其实从一定程度上来讲,也是想借助一下Java的这个名头啊,跟这是有关系的啊,所以当一个新的语言在诞生的时候呢,他都尽可能的想跟这个大树呢去靠一靠,这也是人之常情,对吧,所以我们也很好理解,那呃,从这个具体的这个层面上来讲的话呢,这里提到了第一个叫与Java环境外的一个交互。
08:18
啊,有时候呢,Java应用需要呢,Java外部环境的一个交互,这是咱们本地方法存在的一个主要原因。诶,这个咱们嗯去想谁呢?那这个Java呢,它的一个诞生发展的历程,其实就跟我们每个人的发展历程一样,或者说呢,跟国家也是一样的,呃你比如说一个比如就咱们国家吧,咱们国家在建国之后啊,这个今年是,呃这个一九年呢,是咱们呃建国70周年的时候啊,我记得当时在这个头条的这个当中看过一个新闻,是一个外国的记者在当年建国咱们左右的那个时间呢,在国内拍摄的一些照片哈,这个看到以后呢,确实非常的触目惊心,嗯,就是现在呢,在大城市里边生活,甚至说呢,呃,也所谓的是一个城市的一个白领一样哈,呃每天呢,这个吃喝不愁是吧,当然也有一些自己顾虑的问题哈,上学问题啊,房子问题啊,这当然也有这个问题哈,当然呢,基本的生活是能保障的,呃,所以你想象不到这个70年前在建模的时候呢,中国的那种状况。
09:23
啊,就是你看到那些老百姓眼神无光是吧,这个呃,在生命的在,在这个生存这个线上去徘徊,没吃没穿没衣服是吧,这个这个确实是非常艰苦的一种状态哈,然后中国能有呃,70年的这个稳定的这个发展,包括近40年的改革开放,其实真的是非常非常的不容易的哈,所以有时候我们老是希望说身边这不好了,那不好了,去埋怨政府,埋怨谁的,其实有时候想一想,世界上有哪一个国家能做的更好呢?至少我觉得目前来看的话呢,其实没有啊,就我们更多的还是应该看到一些正能量,正方正正面的一些东西啊,那很多问题呢,我们需要在发展当中去解决啊,啊这个说的有点远了哈,我们再拉回来,就比如说咱们国家吧,虽然说国土面积很大啊,在建国的时候呢,其实也是一穷二白,那么这个时候呢,只要你跟呃别的国家出去,只要你出去啊,你就可能不可避免的,比如说咱们这里边儿认为的C跟C加呢,C加加呢,你就可以理解成美国啊中国呢,这个呃,国内战争,当然跟这个国民党战争的时候呢,其实美国咱都知道在后边支援这个国民党是吧?啊那这个呃,那我们建国以后的话呢,呃,只要你出去跟别的国家在交流的时候呢,多多少少呢,可能都会跟美国搭上边,所以呢,只要就跟这个Java一样哈,只要你跟其他的外部环境去交互的时候呢,你都可能不可避免的要跟C,跟C加加呢去这个打上交道,所以说这个呢,你是难以避免的这种情况。
10:55
啊,那我们这个本地方法呢,就是呃,应对这样的一种交流的机制啊,其中了一种非常简易的接口,呃,用于我们呢,直接去了解Java应用之外的,诶不用我们去了解Java之外这些细节了,直接呢我们去调用诶它之外的这些结构就可以了啊就是为我所用是吧?诶我们跟外边打交道的时候呢,可能不可避免呢,跟美国呢要扯上关系,那这块呢,我们干脆呢,就提供一个相应的接口,直接呢来调用呃他美国相应的一些这个结构是吧?诶这样来理解啊。
11:26
然后第二个呢,说以操作系统的交互啊,刚才呢,提到了一个问题说呃,如果对程序的效率比较在意的时候,我们呢,诶会考虑说调用一些更方便的机构,比如说C跟C加加,那我们知道呢,操作系统它底层呢,更多的还是用C或C加加来编写的啊,那如果呢,我们希望更在乎这个执行效率的话呢,那就需要考虑到哎,调用这个C了。啊,这跟这个C,它这个外部环境的强大与否,其实倒还不是一个层面的意思哈,还是它的执行效率的一个情况啊,那这个操作系统呢,主要原因就是操作系统呢,底层是用C和C加加来实现的,所以这块你看提到了,虽然说呢,咱们Java代码是运行在这个GM上的啊,这个咱们可以直接看这个图直接说明就行啊,虽然说咱们这个Java代码呢是运行在GM上的,但是GM呢毕竟不是一个真实的操作系统,它呢还需要依赖于具体的这个操作系统才能够这个实现它功能的一个展现啊,那具体这个操作系统层面的话呢,我们说它就不可避免的,呃,需要用这个C来去实现。
12:30
诶,所以说的话呢,我们干脆呢,这个Java语言呢,就需要跟这个,呃,底层这个C呢,进行一些交互啊,比如说咱们刚才提到这个线程。哎,我们这个线程的话呢,最终还需要回归成操作系统的本地线程啊,那我们就需要呢,诶与底层的这个C呢打交道,所以我们会看到呢,在thread里边呢,就会有一系列的本地方法,哎,是这个原因。啊,就是你你跟就跟说一个小国家,呃,你你一个小国家呢,其实跟美国现在如果去敌对的话呢,还是挺挺挺坚强的哈,挺不容易的,呃,比如说像朝鲜哈,这个为什么这么讲呢?因为你只要出国的时候呢,你可以说呢,呃,我我我不用你的这个东西,我不用你的那个东西是吧?诶我不用你这些相应的一些这个接口了,但是的话呢,呃,你的一些国际标准呀,一些这个大家形式的一些规范呀,其实还都可能是美国来制定的,所以呢,你难以避免的就会跟他还会打上交道。
13:28
啊,这个其实是有一定的难度的啊,就是说呃,你想完全不依赖于美国这个存在独立的一套体系,其实是挺困难的啊,这里边就不用包含中国了啊,咱们国家现在呃,已经是一个大国了,是吧,不管是疆域上还是从实际的这种经济实力上啊,跟当年呢,已经是完全不同了。好,然后下一个点呢,提到叫ss Java,诶什么意思呢,就是sun的,Sun公司的这个解释器,它本身呢,就是用C来实现的啊,当然我们说这个GRE啊,这个运行的环境大部分呢,是用Java语言来实现的,当然它底层的话还是用到了C的这个代码啊,还是含有这个C的这种实现的。
14:07
哎,这使得呢,它就能像一些普通的C一样呢,与外界呢进行交互。啊,那既然如此,那你很难避免的去调用这个C了。啊,就还是咱们说这个小国家哈,嗯,你可以说呢,我出去不跟你这个美国相关的东西,我就不跟你去交流,然后呢,这个一些国际的组织的规范呢,我也不参与啊,像朝鲜的很多国际化的组织他都没参与是吧,我也不参与,呃,但是呢,呃,当然这个在朝鲜没有出现过啊,就是有些国家是出现过了,你像这个韩国,像日本是吧,虽然说在经济上呢很强,但是呢,你会发现他们跟美国走得很近,除了这个,呃,咱们说的这个,这不可避免的啊,你像韩国也很小。对于韩国的老百姓,你像咱们中国老百姓一说啊,过过年旅游,或者是11时候去旅游,很多人还是选择国内游,因为咱们国家实在是太大了,相对于韩国这样的国家来讲,他们一说旅游,那八成都是出国,因为国家实在太小了,有啥可旅的是吧?那像那个欧洲国家也是一样,哈,一脚油门下去呢,可能就出国了。
15:08
国家太小是吧,这个这个这个很多哈,所以欧盟这个想联合起来事儿挺好,但是呢,这个各怀鬼胎,各个国家有各个国家的问题,所以现在呢,其实英国都拖出去了是吧,这个欧洲呢,欧盟现在整合起来,其实难度也很大哈。那咱们就说这个像像韩国啊,就是韩国呢,他不可避免的,他得跟美国去打交道,还跟美国去参与一些国际的事务啊,参与一些协议啊等等规范啊,那你还会发现呢,韩国其实它国内呢,有很多的一些组织啊,一些这个这个机构啊,呃,本身呢,就跟美国有有关系啊,像韩国呢,本身它的军事呢,就需要美国来保护嘛,啊这个呢,就不可避免的,你就得需要跟美国走的要近一些,那日本呢,也同样的道理,是吧,就跟说Java一样,Java的话呢,呃,我前面可以都不管,但是呢,你Java底层自己的这个解释器也是用C来写的。
16:03
那你说你能跟C脱离了关系吗?很难是吧?哎,是这个原因啊。行,总之一句话呢,就是基于各样的原因,咱们Java的话呢,呃,会用到这个底层的这个C库啊,以C库为代表的,我们说叫本地方法了啊这那既然我们要用到的话呢,哎,那我们这呢,就专门有一个关键字叫native来表示对于这些方法的一个调用的这个标识啊,这就可以了,行,那最后我们说一下,说到目前是一个什么状态呢?对吧?那原来我们说这个Java的话呢,比较弱小,需要调用这个C,那现在的话呢,Java已经非常成气候了啊,咱们在一开始讲虚拟机的时候呢,呃,提到过Java目前的一个现状,而且呢,它的市场占有率呢,也已经超过了C啊,长期占于排行榜第一的位置上是吧,那到现在呢,Java已经很强大了,呃,基本上我们在写程序的时候呢。咱们就用不着再去写这个本地接口了啊,不会去写了,呃本身在企业级应用当中其实也很少见了,除非呢是我们需要跟硬件打交道啊的话,比如说你要调这种,呃,打印机啊,或者Java系统管理的生产设备啊等等,我们才需要呢,诶去写这种本地方法,那在其他情况下呢,其实已经用不到了。
17:20
啊,而且呢,Java的本身虚拟机的一些调优啊,包括在这种这个大集群环境下的一个这个并发执行啊,就是。可以更好的结合在一起,其实Java呢,现在发展至今呢,它的执行效率,包括底层的一些优化不断的在进行,已经呢基本可以媲美C和C加加了。啊,不管从这个执行效率性能上,还是从Java目前的这个整个生态建设上,呃,已经基本上能够摆脱最底层C和C加加的我们直接去编写了啊,那以前编写的一些呢,倒倒是,呃倒是呢,还可以正常的来调用啊,这个也很正常啊。行,那啰里啰嗦呢,咱们就把什么是这个本地方法接口啊,以及呢,本地方法库这块呢,就介绍完了,大家呢,能有一个印象就可以了啊,然后呢,咱们翻回来再说一下本地方法站。
我来说两句