您的位置:首页 > 编程语言 > Java开发

JAVA开发 分析JNI标准原理,附实例

2011-12-21 08:01 274 查看
JNI已成为JAVA平台的一部分,它允许JAVA代码和其他语言写的代码进行交互。

JNI是JAVA Native Interface的缩写,中文为JAVA本地调用。

JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。

有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:



调用C++函数实例:

环境说明:Win XP系统

1. 在MyEclipse 下新建JniTest项目,然后新建HelloWorld.java和TestDll.java 类

HelloWorld.java源码:

public class HelloWorld {

public native void displayHelloWorld(); //java 本地方法申明

static{

System.loadLibrary("HelloWorld"); //装入(加载)动态链接库,"HelloWorld"是要装入的动态链接库名称

}

}

TestDll.java源码:

public class TestDll {

public static void main(String[] args) {

HelloWorld helloWorld = new HelloWorld();

helloWorld.displayHelloWorld();

}

}

2. 编译JAVA类得到CLASS 文件

3. 生成C/C++头文件:

在windows中代开一个命令窗口,进入jnitest工程所在目录下的bin目录(其实就是找到生成的HelloWorld.class所在的目录),键入 javah -jni HelloWorld 后在当前目录生成 头文件HelloWorld.h。内容如下

HelloWorld.h 源码:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class com_wudi_jni_HelloWorld */

#ifndef _Included_com_wudi_jni_HelloWorld

#define _Included_com_wudi_jni_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_wudi_jni_HelloWorld

* Method: displayHelloWorld

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_jni_HelloWorld_displayHelloWorld

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

4. 本地方法实现

在VS2010中新建C++的Win32 动态链接库项目,项目名HelloWorld 。将上述生成的HelloWorld.h拷贝到HelloWorld目录下面;将JDK安装目录下

include目录中的文件都拷贝到VS安装目录下的VC98\Include目录下面。

在VS中新建HelloWorld.cpp文件,实现头文件中生命的方法并编译生成DLL。

HelloWorld.cpp源码:

#include "stdafx.h"

#include<jni.h>

#include "HelloWorld.h"

#include<stdio.h>

JNIEXPORT void JNICALL Java_com_wudi_jni_HelloWorld_displayHelloWorld

(JNIEnv *env,jobject obj)

{

printf("From jni_helloWorldImpl.cpp:");

printf("Hello world!This is a JNI invoke demo. \n");

return;

}

5. 运行测试程序

先将生成的DLL拷贝到jnitest工程的bin下面,然后设置DLL搜索路径(环境变量PATH)为当前bin目录(JNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可;或者将dll拷贝到system32系统目录下也可以)。刷新项目,运行测试程序,将看到控制台输出:

From jni_helloWorldImpl.cpp:Hello world!This is a JNI invoke demo.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: