JVM怎样使Native Method,为什么要使用Native Method,Java语言如何与本地代码(C/C++)交互,JNI与NDK与sdk

 

JVM怎样使Native Method跑起来:


    我们知道,当一个类第一次被使用到时,这个类的字节码会被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持着一个该类所有方法描述符的list,这些方法描述符包含这样一些信息:方法代码存于何处,它有哪些参数,方法的描述符(public之类)等等。
    如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是它们会被操作系统加载到java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary()实现的。
   
   最后需要提示的是,使用本地方法是有开销的,它丧失了java的很多好处。

为什么要使用Native Method


   java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。
   与java环境外交互:
   有时java应用需要与java外面的环境交互。这是本地方法存在的主要原因,你可以想想java需要与一些底层系统如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解java应用之外的繁琐的细节。
   与操作系统交互:
   JVM支持着java语言本身和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎 样,它毕竟不是一个完整的系统,它经常依赖于一些底层系统的支持。这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,还有,如果我们要使用一些java语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。
    Sun's Java,Sun的解释器是用C实现的,这使得它能像一些普通的C一样与外部交互。jre大部分是用java实现的,它也通过一些本地方法与外界交互。例如:类java.lang.Thread 的 setPriority()方法是用java实现的,但是它实现调用的是该类里的本地方法setPriority0()。这个本地方法是用C实现的,并被植入JVM内部,在Windows 95的平台上,这个本地方法最终将调用Win32 SetPriority() API。这是一个本地方法的具体实现由JVM直接提供,更多的情况是本地方法由外部的动态链接库(external dynamic link library)提供,然后被JVM调用。
 

Java语言如何与本地代码(C/C++)交互

 

一、需要了解的知识点:

基础:C为二代面向过程语言、C++为三代面向对象语言,Java为参考C++所设计的三代面向对象语言,Python是一种解释型脚本语言。不同语言需要不同虚拟机,

  1. Java的:jvm,
  2. python:CPython,当我们从Python官方网站下载并安装好Python 3.x后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。

(1)NDK:允许Java的代码与其他语言的代码进行交互的开发包,不同设备有不同的ndk;ndk指的是本地代码

例如:Windows :c/c++  ,因此我们window的电脑不用安装C/C++虚拟机,仅仅需要开发IDE
(2)jni:java与本地代码(c/c++)通过jni交互
(3)常见使用NDK的平台,TV——电视机,STB——机顶盒,IVI——车载系统,AR——虚拟现实,手机端游戏等。

二、为什么需要NDK
(1)标准的Java虚拟机不支持应用需要的平台相关的功能,例如添加了新的硬件设备。
(2)已经存在使用C/C++等其他语言开发好的库,需要使用JNI来访问他们,例如游戏引擎Cocos2d-X
(3)需要优化其中一部分的源代码,提升整体性能。

补充:

本地代码(native code)是计算机编程(代码),编译用来运行一个特殊的处理器(如英特尔x86级的处理器)和它的特殊指令集。如果同一个程序在不同的处理器上执行的话软件就必须能够模拟出旧的处理器的指令。这种情况下,同一个程序是在模拟模式下运行的,这样就会导致它比在本机模式下运行速度慢。(这个程序可以重写并且重新编译这样就可以用新的处理器执行本机模式了。)

JAVA本地方法

native关键字修饰的方法即为本地方法,本地方法类似接口方法,不过接口方法是用abstract修饰的

不同在于虽然本地方法也看不到实copy现体,但实际上是由jvm在加载时调用底层实现的

本地方法的实现体不是由java代码写的,而可能由别的语言如c实现,可以理解为连接java代码和其他语言实现的代码的入口。

什么是ndk开发和jni开发 综述:

jni就是在你app中写c++代码,然后进行java调用native 部分代码;

sdk 是将c++代码打包成  .so文件,在其他项目中进行调用;快速开发C、 C++的动态库,并自动将so和应用一起打包成 APK

 

 

JNI:

为什么要有JNI

背景:实际使用中,Java 需要与 本地代码 进行交互
问题:因为 Java 具备跨平台的特点,所以Java 与 本地代码交互的能力非常弱
解决方案: 采用 JNI特性 增强 Java 与 本地代码交互的能力

实现步骤

1.在Java中声明Native方法(即需要调用的本地方法)
2.编译上述 Java源文件javac(得到 .class文件)
3.通过 javah 命令导出JNI的头文件(.h文件)
4.使用 Java需要交互的本地代码 实现在 Java中声明的Native方法
4.1.如 Java 需要与 C++ 交互,那么就用C++实现 Java的Native方法
5.编译.so库文件
6. 通过Java命令执行 Java程序,最终实现Java调用本地代码


Native Development Kit,是 Android的一个工具开发包
JNI 与 NDK 无直接关系 ---- NDK属于Android,JNI 属于java

 

  android sdk (Android Software Development Kit, 即android软件开发工具包)可以说只要你使用java去开发Android这个东西就必须用到。他包含了SDK Manager 和 AVD Manage,对于android系统的一些开发版本的管理以及模拟器管理。它只能运行纯java程序,有了它模拟器才可以使用。

  而ndk (Native Development Kit)跟sdk差不多的是它也是一个开发工具包。用它开发c/c++是很方便的。他有一个强大的编译集合。Java调C、C++(jni接口),是一些java如何调C的代码。它会把C代码编译成一个.SO的动态库,通过jni接口用java代码去调用它,有了它我们可以直接在android代码中去添加C代码。 

 

ndk和sdk都是开发工具包,在Android studio 中指定是: local.properties
ndk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\sdk\\ndk-bundle
sdk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\sdk

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhangJiQun&MXP

等到80岁回首依旧年轻

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值