java 本地接口(java native interface)

来源:百度文库 编辑:神马文学网 时间:2024/04/27 15:16:38
Java本地接口(JNI)是为java编写本地方法和jvm嵌入本地应用程序的标准的应用程序接口。首要的目标是在给定的平台上通过所有的jvm来实现兼容的二进制编码本地方法库。
当使用经典的虚拟机时,Java2 SDK支持早期的本地方法接口(Native Method Interface)。 NMI是最初在JDK1.0实现的,NMI并不是java平台标准的一部分。
Java Native Interface Tutorialhttp://java.sun.com/docs/books/tutorial/native1.1/index.html
这个指南告诉你怎么把本地方法集成到你的java程序里面,你将会学会怎样写本地方法,本地方法是一种使用其他语言来实现的方法,比如C.
JNI 概述
JNI是一个本地编程接口,使用JNI务必保证你的代码能够在所有的平台在完全兼容。当某些应用程序不能完全通过java实现的情况下,程序员就可以使用JNI来写本地接口方法来处理这些情况,例如,你可能需要使用这些本地方法和JNI在下面的情况:
·在你的应用程序里面,java类库可能不能支持独立平台的一些特征
·你可能有一些其他语言写好的链接库,并且你希望通过java应用程序来访问这些链接库
·你可能想要通过低级语言来实现一部分效率要求很高的代码,比如汇编,然后通过java应用程序来调用它。
一个本地方法可以创建java对象,包括数组和字符串,然后检查和使用这些对象来执行某些任务。一个本地方法也可以更新由它创建或被传进来的java对象,并且这些被更新的对象对于java程序来说同样有效。因此,无论是本地语言部分还是java语言部分都可以创建、更新和访问java对象,并且在他们之间共享这些变量。
JNI允许你在本地方法中使用java语言。具体的说,你可以在本地方法中catch and throw异常,并且把异常处理交给java应用程序来处理。本地方法同时也可以获取java类信息。通过调用JNI函数,本地方法可以加载java类和获取类信息。最后,本地方法能使用JNI来执行时时的类型检查。
下图解释了传统的C语言如何使用JNI连接java库,并调用java方法,使用java类等
下图是java应用程序调用本地方法,显示了许多java程序利用JNI的可能性,包括调用C方法,C++类,调用汇编例程等等

很容易看到,JNI像胶水一样把java应用程序和本地应用程序粘在了一起

待续 。。。
关于jni的测试
环境 jdk1.4.2_08;  vc6.0;  winxp sp1
1.编写java程序
//Filename:JNITest.java
public class JNITest{
public native void sayHello();
public native int getInt();
public native void setInt(int i);
static{
System.loadLibrary("testdll");
}
public static void main(String[] args){
JNITest test = new JNITest();
test.sayHello();
System.out.println(test.getInt());
test.setInt(100);
System.out.println(test.getInt());
}
}
2.编译java程序
javac JNITest.java
3.生成.h文件
javah JNITest
4.用生成的.h文件编写连接库(本例使用vc6.0)
JNITest.cpp如下
#include "JNITest.h"
int i = 0;
/*
* Class:     JNITest
* Method:    sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_JNITest_sayHello
(JNIEnv *, jobject){
printf("Hello,world!\n");
}
/*
* Class:     JNITest
* Method:    getInt
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_JNITest_getInt
(JNIEnv *env, jobject o){
return i;
}
/*
* Class:     JNITest
* Method:    setInt
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_JNITest_setInt
(JNIEnv *env, jobject o, jint ji){
i = ji;
}
5.把编译好的testdll文件copy到class目录下
6.运行java程序
java JNITest
输入结果
Hello,world!
0
100
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=400170