java本地接口_java 本地接口(java native interface)

这篇博客详细介绍了Java本地接口JNI,它是用于在Java中编写本地方法和嵌入本地应用程序的标准接口。JNI允许在不同平台上实现二进制兼容的本地方法库。文中展示了如何将本地方法集成到Java程序中,包括如何编写本地方法、如何与Java对象交互以及如何在本地方法中捕获和处理异常。此外,还给出了一个使用JNI的Java程序示例,演示了从C++调用Java方法和类的过程。

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

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

这个指南告诉你怎么把本地方法集成到你的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类等

native1.gif

下图是java应用程序调用本地方法,显示了许多java程序利用JNI的可能性,包括调用C方法,C++类,调用汇编例程等等

native2.gif

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

nativesides.gif

待续 。。。

关于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值