标签:style blog http java color 使用
Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。
在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。 (没有,有,速度)
标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的
你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的
程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们。
JNI 编程模型:
JNI编程分为以下步骤完成:
编写带有 native 方法的 java 代码: HelloWorld.java
生成 java 代码的 class 文件: HelloWorld.class
用 javah 命令生成 .h 头文件:
这个头文件相当于一个接口,里面声明了和 java 代码的 native 方法一致的方法:
java_HelloWorld_nativeMethodName(JNIEnv *, jobject);
使用 c/c++ 实现上面的本地方法。
注意必须 include 进 jni.h 因为 jni.h 中定义了 JNIEnv, jobject 等数据类型。
native层回调java层:在 c/c++ 代码中,可以实现对 java 代码的调用,如在cpp文件中:
这里是 new 出一个 java 的 ArrayList 对象。
将 c/c++ 编写的文件生成动态链接库:.dll 文件,或 .so 文件。
图解:
java程序启动时,将动态链接库 load 到 jvm 中(一般通过 static 块进行加载),程序运行时,遇到对 native 方法调用时:
依据 native 方法所在类名,找到对应的 .h 文件
依据 .h 文件,找到对应的 c/c++ 实现
执行 native 代码
Native 代码返回结果给 java
我的理解是,采用异步的方式:java 线程调用native方法,然后进入阻塞状态,native本地代码由系统开启一个新的线程执行,待执行完毕,java线程唤醒,继续执行。
多线程对 native 方法的调用,可能会更加复杂,可以参考:
3). 关于native 调用内存的问题:
这里再复习下 jvm 内存结构:
Jvm 内存分为两个子系统和两个组件:
Class loader子系统
根据给定的全限定名类名(如java.lang.Object)来装载class文件的内容到Runtimedataarea中的methodarea(方法区域)。Java程序员可以extendsjava.lang.ClassLoader类来写自己的Classloader。
Execution engine(执行引擎)子系统
执行classes中的指令。任何JVMspecification实现(JDK)的核心都是Executionengine,不同的JDK例如Sun的JDK和IBM的JDK好坏主要就取决于他们各自实现的Executionengine的好坏。
Runtime data area(运行时数据区域)组件
这就是我们常说的JVM的内存了。它主要分为五个部分:
Heap(堆):一个Java虚拟实例中只存在一个堆空间。
MethodArea(方法区域):被装载的class的信息存储在Methodarea的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。
JavaStack(java的栈):虚拟机只会直接对Javastack执行两种操作:以帧为单位的压栈或出栈。
ProgramCounter(程序计数器):每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
Nativemethodstack(本地方法栈):保存native方法进入区域的地址。
以上五部分只有Heap和MethodArea是被所有线程的共享使用的;而Javastack,Programcounter和Nativemethodstack是以线程为粒度的,每个线程独自拥有自己的部分。
Native interface(本地接口)组件
与native libraries交互,是其它编程语言交互的接口。当调用native方法的时候,就进入了一个全新的并且不再受虚拟机限制的世界,所以也很容易出现JVM无法控制的nativeheapOutOfMemory。
当 jvm 执行 native 调用时,native 代码(如c/c++)执行时所用的内存,并不在jvm的堆上,比如 c/c++ 可能直接通过 malloc 向系统申请内存,jvm不能管理这些内存,所以可能会出现 NativeHeapOutOfMemory问题。Jvm 内虽然有一个 native method stack区域,但它只是用来保存 native 方法进入区域的地址。
标签:style blog http java color 使用
原文地址:http://www.cnblogs.com/jony-zhang/p/3817204.html