新的原生方法接口——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> 整个过程就完成了。
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> 整个过程就完成了。
(套接字循环读)。,另一个帧页输入。