JNI是SUN(被Oracle收购了)定义的一套标准接口。具体平台上的jvm实现,对应对实现JNI接口,供本地(c/c++)应用与java VM 互调。
JNI,是一套完善并且功能强大的双向接口,能够实现语言的互操作性--可以供java代码调用native代码,native代码也可以调用java代码。
--------------
JNI是Java平台中的一个强大特性,应用程序可以通过JNI把C/C++代码集成进Java程序中。通过JNI, 开发者在利用Java平台的强大功能同时,又可以复用原有的代码,因为JNI是Java平台定义的规范接口,当把本地库集成到Java中,只要在一个平台上解决了语言互操作问题,就可以把解决方案比较容易的移植到其他平台上。
-----------------------
一个JNI编程的简单例子:
package com.test;
public class HelloWorld {
public native void displayHelloWorld();
static
{
System.loadLibrary("fileName");
}
public static void main(String[] args) {
new HelloWorld ().displayHelloWorld();
}
}
然后根据写好的文件编译成CLASS文件
然后在classes或bin之类的class根目录下执行javah -jni com.test.HelloWorld,
就会在根目录下得到一个com_test_HelloWorld.h的文件
该.h文件的详细内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_test_HelloWorld */
#ifndef _Included_com_test_HelloWorld
#define _Included_com_test_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_test_HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_test_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
然后根据头文件的内容编写com_test_HelloWorld.c文件
#include "com_test_HelloWorld.h"
#include "jni.h"
#include "stdio.h"
JNIEXPORT void JNICALL Java_com_test_HelloWorld_displayHelloWorld (JNIEnv *, jobject) {
printf("Hello world!\n");
return;
}
之后编译生成DLL文件如“fileName.dll”,名称与System.loadLibrary("fileName")中的名称一致
vc的编译方法:cl -I%java_home%\include -I%java_home%\include\win32 -LD com_test_HelloWorld.c -FefileName.dll
最后在运行时加参数-Djava.library.path=[dll存放的路径]
-LD:生成动态链接库
-D:设置Java平台的系统属性。设置后JavaVm可以找到对应的库文件。
其中参数JNIEnv * JNIEnv结构包括JNI函数表