JNI(Java Native Interface,) java本地接口

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函数表

你可能感兴趣的:(java,jni)