WEB开发网
开发学院软件开发VC 例解用 VC++ 6.0 实现 JNI 阅读

例解用 VC++ 6.0 实现 JNI

 2007-03-23 21:30:24 来源:WEB开发网   
核心提示: 表1 Java基本类型到本地类型的映射表2 Java中的类到本地类型的映射Step 4:使用VC来编写本地方法的实现函数,最后编译成.dll文件,例解用 VC++ 6.0 实现 JNI(3),过程如下:1) 选择new->projects(选择Win32 Dynamic-Link L

表1 Java基本类型到本地类型的映射

表2 Java中的类到本地类型的映射

Step 4:使用VC来编写本地方法的实现函数,最后编译成.dll文件。过程如下:

1) 选择new->projects(选择Win32 Dynamic-Link Library,以Step 1中指定的库名WinMsgDll作为工程名)->OK->An ampty DLL project->Finish。

2) 选择Tools->Options->Directories(添加目录D:J2SDK1.4.2_03INCLUDE和D:J2SDK1.4.2_03INCLUDEWIN32)。在这些目录中包含JNI所需的头文件。

3) 将Step 3生成的edu_netcom_jni_WinMsgBox.h拷贝到WinMsgDll工程文件夹中。然后FileView中添加这个头文件。

4) 添加源文件WinMsgDll.cpp,内容如下:

#include "windows.h"
#include "edu_netcom_jni_WinMsgBox.h"
/*
* Class:   edu_netcom_jni_WinMsgBox
* Method:  showMsgBox
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_edu_netcom_jni_WinMsgBox_showMsgBox
(JNIEnv * env, jobject obj, jstring str){
  const char *msg;
  msg = env->GetStringUTFChars(str,0);
  MessageBox(NULL,msg,"Java invoke",MB_OK);
  env->ReleaseStringUTFChars(str,msg);
}

5) 编译生成WinMsgBox.dll文件。并将这个.dll文件拷贝到Step 1中说明的目录中。

注意:

1) 我们知道dll文件有两种指明导出函数的方法,一种是在.def文件中定义,另一种是在定义函数时使用关键字__declspec(dllexport)。而在JNI中函数定义中的关键字JNIEXPORT实际在jni_md.h中如下定义,#define JNIEXPORT __declspec(dllexport),可见JNI默认的导出函数使用第二种。使用第二种方式产生的导出函数名会根据编译器发生变化,在有的情况下会发生找不到导出函数的问题(我们在JSP中使用JNI时就发生了这种问题,百思不得其解,后来强行加入一个.def文件就解决了)。因此最好是使用第一种方法自己定义一个.def文件来指明导出函数,这种情况下会强制使用第一种方式产生导出函数。本例中可以加入一个WinMsgDll.def文件,内容如下:

LIBRARY   "WinMsgDll"
DESCRIPTION 'message Windows Dynamic Link Library'
EXPORTS
  ; Explicit exports can go here
  Java_edu_netcom_jni_WinMsgBox_showMsgBox

2) 从本例中,我们可以看到WinMsgBox.java决定了edu_netcom_jni_WinMsgBox.h,而后者又决定了WinMsgDll.dll,也就是说,这是一个"牵一发而动全身"的过程,如果你改动了WinMsgBox.java,就一定要把整个步骤都走一遍(这一点一定要切记,因为这也是我们跌得鼻青脸肿后才得出的警世良言)。

3) 生成的.dll文件一定要正确拷贝到Step 1说明的目录中,本例中是将生成的WinMsgDll.dll和Step 5中的测试文件放在同一个目录下的(这也是我们困惑了很久才解决的问题)。

Step 5:编写一个测试文件来测试对WinMsgDll.dll的调用。测试文件TestJNI.java内容如下:

//TestJNI.java
import edu.netcom.jni.WinMsgBox;
public class TestJNI
{
  public static void main(String[] args)
  {
       WinMsgBox box = new WinMsgBox();
    box.showMsgBox("Wonderful!!");
  }
}

编译,运行,windows下的对话框跃然屏幕中间。到此为此,整个JNI的实现过程就已经完成了。

上一页  1 2 3 

Tags:解用 VC 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接