JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
举例说明:
1、java程序清单:
package cn;
public class HelloWorld {
/**
* @param args
*/
static {
System.loadLibrary("hello");
}
public native void DisplayHello();
public static void main(String[] args) {
// TODO Auto-generated method stub
new HelloWorld().DisplayHello();
}
}
2、javac ./cn/HelloWorld.java 编译源文件 ,生成相应的字节码文件HelloWorld.class
3、使用javah生成头文件
javah -jni cn.HelloWorld 为本地方法生成HelloWorld.h文件(在当前目录下生成)
内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class cn_HelloWorld */
#ifndef _Included_cn_HelloWorld
#define _Included_cn_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: cn_HelloWorld
* Method: DisplayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_cn_HelloWorld_DisplayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。
2)、此头文件中的Java_cn_HelloWorld_DisplayHello(JNIEnv *, jobject)方法,是将来与动态链接库交互的接口。
4、vi MyHelloWorldImp.c 编写C语言实现 java_cn_HelloWorld_DisplayHello()方法
#include
#include "cn_HelloWorld.h"
#include
JNIEXPORT void JNICALL Java_cn_HelloWorld_DisplayHello
(JNIEnv *env, jobject obj)
{
printf("**From MyHelloWorldImpl.c :");
printf("Hello world ! \n");
return;
}
5、生成动态库
gcc -I/usr/jdk1.5.0_21/include/ -I/usr/jdk1.5.0_21/include/linux/ MyHelloWorldImp.c -o libhello.so -shared -fPIC
在当前目录下生成动态链接库libhello.so文件:
6、有了具体实现的动态库后,就可以运行JAVA调用JNI程序类的native方法.
java -Djava.library.path=. cn.HelloWorld
结果: