分享

java 本地接口(java native interface)

 jinzq 2007-01-04

Java本地接口(JNI)是为java编写本地方法和jvm嵌入本地应用程序的标准的应用程序接口。首要的目标是在给定的平台上通过所有的jvm来实现兼容的二进制编码本地方法库。

    当使用经典的虚拟机时,Java2 SDK支持早期的本地方法接口(Native Method Interface)。 NMI是最初在JDK1.0实现的,NMI并不是java平台标准的一部分。

 

Java Native Interface Tutorial http://java./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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多