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

java native interface(java 本地方法调用)

2012-03-22 21:45 344 查看
在开发中,有时java并不能胜任所有的工作,比如说java swing中不能直接操作任务栏,java不能直接操作进程等,而java 本地调用接口就可以解决这个问题,一种思想的引进带给人们好的一面,那么它必定会有坏的一面,jni也同样如此,它在增强运行效率的同时,也给程序的可移植性带来影响,下面我来讲解jni的一个小小的例子(在命令行中输出Hello World):

Step 01:

安装jdk,配置好环境变量。

Step 02:

在eclipse中新建一个jni的java project,在src目录下新建HelloWorld.java,代码如下:

public classHelloWorld {
public native void helloWorld();
}

Step 03:

用javah命令生成HelloWorld.h文件,我的eclipse工作目录在F:\eclipseworkbench下,命令如下:



其中–d F:\eclipseworkbench\jni是指定生成的HelloWorld.h的输出路径,执行命令完成后,在F:\eclipseworkbench\jni目录下会多出一个HelloWorld.h的文件,如图:



Step 04:生成相应的dll动态链接库,先新建一个HelloWorld的Win32Project,我是建在F盘,如下:



点击OK--->next---->在application type里面选择DLL,如下:



点击Finish。

建好项目后,打开自己安装jdk的目录,打开include文件夹,将里面的 jni.h文件,jawt_md.h文件和jni_md.h文件复制到刚建项目的文件夹下,同时将刚用javah命令生成的HelloWorld.h文件也复制到此文件夹下,如图所示:



在VS中将刚才的四个.h文件引入项目中,如图所示:



打开HelloWorld.h文件,修改如下:

/* DO NOTEDIT THIS FILE - it is machine generated */
#include"stdafx.h"
#include"jni.h"

/* Header for classHelloWorld */

#ifndef_Included_HelloWorld
#define_Included_HelloWorld
#ifdef__cplusplus
extern"C" {
#endif
/*
* Class: HelloWorld
* Method: helloWorld
* Signature: ()V
*/
JNIEXPORT voidJNICALL Java_HelloWorld_helloWorld
(JNIEnv *, jobject);

#ifdef__cplusplus
}
#endif
#endif
打开HelloWorld.cpp文件,修改如下:

// HelloWorld.cpp : Definesthe exported functions for the DLL application.
//

#include"stdafx.h"
#include"HelloWorld.h"

JNIEXPORT voidJNICALL Java_HelloWorld_helloWorld
(JNIEnv *, jobject)
{
printf("Hello World");
}

再Build该项目,就会在该项目的Debug文件夹下看到HelloWorld.dll文件,如图所示:



将此HelloWorld.dll文件复制到System32目录下。

Step 05:

运行java文件,修改HelloWorld.java如下

public classHelloWorld {
public native void helloWorld();

static {
System.loadLibrary("HelloWorld");
}

public static void main(String[] args) {
new HelloWorld().helloWorld();
}
}

运行此文件,结果如下:



此时大功告成!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: