1 概述
1.1 Jni概述
jni(Java Native Interface)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计 的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。
1.2 native关键字
使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。 这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。
java是跨平台的语言,既然是跨了平台,所付出的代价就是牺牲一些对底层的控制,而java要实现对底层的控制,就需要一些其他语言的帮助,这个就是native的作用了。
1.3 步骤
1、编写带有native声明的方法的java类,生成.java文件
2、使用javac命令编译所编写的java类,生成.class文件
3、使用javah -jni java类名生成扩展名为h的头文件,也即生成.h文件
4、使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法
5、将C/C++编写的文件生成动态连接库,生成.dll文件
2示例
2.1 声明native方法,装载动态链接库。
public class Alice {
public native void display();
}
“Alice”(Alice.dll)是要装入的动态链接库名称。
public class Main {
static {
System.loadLibrary("Alice");
}
public static void main(String[] args) {
Alice alice = new Alice();
alice.display();
}
}
2.2 编译生成.class文件
使用javac命令编译Alice.java文件生成Alice.class。(在Eclipse自动完成,Alice.class存在工程的bin目录下)
2.3 生成.h文件
使用javah -jni 命令生成Alice.head,首先定位到C:\Program Files\Java\jdk1.8.0_25\bin(javah.exe所在目录),将Alice.class复制至此目录中,Alice.h也会在此目录中生成。
cd C:\Program Files\Java\jdk1.8.0_25\bin
javah -jni Alice
打开Alice.h文件,编写Alice.cpp文件时要去实现JNIEXPORT void JNICALL Java_Alice_display (JNIEnv *, jobject) 函数
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Alice */
#ifndef _Included_Alice
#define _Included_Alice
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Alice
* Method: display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Alice_display
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
2.4 编写Alice.cpp文件
主要是用C/C++实现JNIEXPORT void JNICALL Java_Alice_display (JNIEnv *, jobject) 函数,生成在E:\Software\Eclipse\MyProjects\jni 目录下。
#include "Alice.h"
#include <stdio.h>
#include <jni.h>
/*
* Class: Alice
* Method: display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Alice_display
(JNIEnv *, jobject)
{
printf("Hello World!\n");
return;
}
2.5 生成.dll文件(动态链接库)。
将 C:\Program Files\Java\jdk1.8.0_25\include\jni.h
和 C:\Program Files\Java\jdk1.8.0_25\include\win32\jni_md.h
和 C:\Program Files\Java\jdk1.8.0_25\bin\Alice.h 这三个文件拷贝到
E:\Software\Eclipse\MyProjects\jni目录下。
使用Visual Studio x64 Win64命令提示(我的Visual Sudio版本为2010)。
cl/LD E:\Software\Eclipse\MyProjects\jni\Alice.cpp
执行命令成功后将在E:\Software\Microsoft Visual Studio 10.0\VC目录中生成以下四个文件。
Alice.dll
Alice.exp
Alice.lib
Alice.obj
2.6 添加.dll到Java工程
我的做法是在此工程中添加jni目录,并将Alice.dll添加到此jni目录中。
将此jni目录设为该工程引用dll库的路径设置(system.loadLibrary()调用Dll路径问题)
右击项目名|选择属性properties|在左边列表内选择“Java Build Path”|在右边选项卡用选择“source”|点开项目名前的“+”号,选择“Native library location”,“Edit”选择上面dll路径。
2.7 运行工程
控制台成功打印”Hello World!”
3 参考资料
http://blog.csdn.net/xw13106209/article/details/6989415
http://blog.csdn.net/code_nice/article/details/48086003
http://www.07net01.com/zhishi/229508.html