在开发中,有时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();
}
}
运行此文件,结果如下:
此时大功告成!