星期六, 十月 29, 2005

Java JNI 基本使用说明

Java JNI 解说.
步骤:

  1. 先建立一个标准java Class
通过native表明方法是平台相关的.
class TestNative {
     private native void print(); //注意方法声明
     public static void main ( String [ ] args ) {
           new TestNative().print();  //注意调用方法
     }
     static {
           System.loadLibrary ("helloWorld"); // 注意Load 动态库的语法.
     }
}
  • 注意:根据Java JNI 规范,
loadLibrary 根据平台不同会把 库名字修改为本地的lib名字.WindowsLib的名字同参数名字相同后缀上.dll.Unix类的平台下,往往修改为:lib参数名.so的最终名字。比如helloWorldUnix必须把文件名修改为libhelloWorld.so并设置LD_LIBRARY_PATH=包含这个.so的路径,才不会出现java.lang.UnsatisfiedLinkError的异常
  • 生成C用头文件

  • javac TestNative.java

  • javah ?jni TestNative
2.2后会产生一个头文件:TestNative.h内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestNative */

#ifndef _Included_TestNative
#define _Included_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     TestNative
* Method:    print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_TestNative_print
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
注意红色的: Java_TestNative_print 函数名的生成是按照JNI规范产生的
模式为Java_类名_方法名.

  1. 编辑对应的C代码:
#include <stdio.h>
#include "TestNative.h" //这行必须加入

JNIEXPORT void JNICALL
Java_TestNative_print ( JNIEnv* env, jobject obj )
{
      printf ( "Hello, Native!\n" ) ;
     return ;
}

  1. 编译源程序(注意生成的动态库的命名规则
Linux :
[root]# gcc TestNative.c -o libhelloWorld.so -shared -I /usr/java/j2s
dk1.4.2/include/linux/ -I /usr/java/j2sdk1.4.2/include/
Window:..
  1. 设置路径
Linux:
export LD_LIBRARY_PATH= .so文件所在目录名
  1. java TestNative 得到结果
  Hello, Native!