新的原生方法接口——JNI (以下尚未校对)
  Java风行后,数家生产商如Netscapt,Microsoft都提出了自己的原生方法接口方案。SUN公司为了统一各种方案,提出了一套完整的原生方法接口规范,并在1.1版本的JDK中增加了相关功能。新的原生方法接口比原来的效率更高,功能也较强。这一节将介绍新的接口,并给出前文中三个例子的新版本。  13.4.1生成动态链接库的步骤
  新方法中生成动态链接库的步骤与旧方法类似,但略徽简单一点。我们仍以节13.2中的例子DispDemo为例为说明。  (1)创建Java源文件和.class文件  这一步的工作与旧方法相同。我们得到的DispDemo.java和DispDemoMain.java也是一样的。用javac把它们编译成.class文件。  (2)生成头文件  这一步用javah生成一个JNI风格的头文件。新方法中不再需要存根文件。具体的做法是:注意命令行参数的变化。  由此可以得到如下头文件(例13.15)。  例13.15 JNI风格的DispDemo.h。/*DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class DispDemo */ #ifndef _Included _DispDemo 
#define _Included _DispDemo 
#ifdef __cplusplus 
extern "C"{ 
#endif 
/* 
* Class:DispDemo 
* Method:display 
* Signature:()V 
*/ 
JNIEXPORT void JNICALL Java _DispDemo _display 
(JNIEnv *,jobject); #ifdef __cplusplus 

#endif 
#endif 
  注意这个文件的第15、16行,它说明了实现文件中应编写的方法的原型。  (3)创建C源文件  这一步用C语言编写方法的具体实现。我们这个例子的功能很简单,只要编写一个很短的函数。源码见例13.16。  例13.16 DispImp.c。#include <stdo.h> 
#include <jni.h> 
#include "DispDemo.h" 
JNIEXPORT void JNICALL 
Java _DispDemo _display(JNIEnv *env,jobject obj) 

printf("Native method exceuting...\n"); 

  由示例可见,程序由引用的头文件与老方法不同,用“jni.h”代替了“StubPreamble.h”。总的说来,程序中需要引用的头文件有三类:jni.h,第三步中生成的头文件,以及实现功能所需的头文件。另外,函数原型也有变化。编程时,按头文件中的方法原型来编写即可。  (4)生成动态链接库(共享库)  对WIN95/NT平台,可以用下面的命令来生成例子所需的动态链接库:  cl -Ic:\java\include -Ic:\java\include\win32 -LD DispImp.c -Fedispdll.dll或者,先设定路径,再编译。如先用一个批文件native.bat设定所有路径:  C:\bookDemo\ch13>native  C:\bookDemo\ch13>set path=c:\msdev\bin;c:\jdk1.1.1\bin  C:\bookDemo\ch13>set include=c:\msdev\include;c:\msdev\mfc\include;  c:\jdk1.1.1\include;c:\jdk1.1.1\include\win32;  C:\bookDemo\ch13>set lib=c:\msdev\lib;c:\msdev\mfc\lib;c:\jdk1.1.1\lib  C:\bookDemo\ch13>  再编译链接:  C:\bookDemo\ch13>cl -LD DispImp.c -Fedispdll.dll  Microsoft (R) 32 -bit C/C++ Optimizing Compiler Version 10.20.6166 for 80x86  Copyright (C) Microsoft Corp 1984-1996. All rights reserved.  DispImp.c  Microsoft (R) 32-Bit Incremental Linker Version 4.20.6164  Copyright (C) Microsoft Corp 1992-1996. All rights reserved.  /dll  /implib:dispdll.lib  /out:dispdll.dll  DispImp.obj  Creating library dispdll.lib and object dispdll.exp  就得到了我们需要的动态链接库。  类似地,在Solaris系统中,用下面的命令生成共享库:  cc -G -I/usr/local/java/include -I/usr/local/java/include/solaris DispImp.c -o libDispdll.so  (5)装入动态链接库,调用native方法  用java解释器运行程序,得:  C:\bookDemo\ch13>java DispDemoMain  Native method executing...  C:\bookDemo\ch13>  整个过程就完成了。