JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
JNI是Java Native Interface的缩写,它的设计目的是:
The standard Java class library may not support the platform-dependent features needed by your application.
You may already have a library or application written in another programming language and you wish to make it accessible to Java applications
You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions
示例1:xp下的例子—使用eclipse和vc6
1.新建一个java类:
public class testdll {
static{
System.loadLibrary("testdll"); //调用其他语言写的本地类库
}
public native static int get(); //声明本地方法
public native static void set(int i); //声明本地方法
public static void main(String[]args){
testdll test = new testdll();
test.set(10); //调用本地方法
System.out.println(test.get()); //调用本地方法
}
}
2.编译成class文件:javac testdll.java
3.使用javah由class文件生成扩展名为h的头文件:javah –jni testdll
这个.h文件不需要进行任何修改,其中包括了本地方法的原型,方法的具体实现需要由c、c++来做。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class testdll */
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get
(JNIEnv *, jclass);
/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
4.编写本地方法—实现由javah命令生成的头文件中声明的本地方法原型
详细:新建一个空的win32 dll工程,新建一个名为testdll.cpp的源文件
#include "testdll.h" //这里我把前面生成的testdll文件拷贝到vc dll工程中
int i;
JNIEXPORT jint JNICALL Java_testdll_get(JNIEnv *, jclass){
return i;
}
JNIEXPORT void JNICALL Java_testdll_set
(JNIEnv env, jclass jc, jint j){
i = j;
}
5.生成动态库:
1)命令行下编译要被java调用的c/c++ dll:
cl -I"D:/Program Files/Java/jdk1.6.0_02/include" -I"D:/Program Files/Java/jdk1.6.0_02/include/win32" -LD testdll.cpp –Fetestdll.dll
2)把生成的dll文件(或so文件)拷贝到前面的testdll.calss文件所在的目录。
需要注意:文件路径有空格的,要用双引号引起来。
6.运行程序:java testdll
效果:
需要注意的是:在linux环境下,运行testso时,如果显示找不到libtestc.so,需要设置LD_LIBRARY_PATH为当前目录
小结:
(1)编辑并编译java程序: javac testdll.java
(2)编译生成.h文件: javah -jni testdll
(3)编辑并编译.cpp文件
用cl命令,如:cl -I"D:/Program Files/Java/jdk1.6.0_02/include" -I"D:/Program Files/Java/jdk1.6.0_02/include/win32" -LD testdll.cpp–Fetestdll.dll
--------------------------------------------------------------------------------------------
说明:本文是在参考众多资料并实践后的一个归纳总结,不能算是完全的原创,故标以“转帖”标签,以示慎重。参考的原帖未能一一表明,敬请原作者谅解。