`

SWT/JFace专题 --- SWT结构浅析

 
阅读更多
SWT技术是一套基于Java的第三方图形工具库。它的设计思想是提供一套通用的API,使得开发出的图形程序可以不加修改地在平台之间移植,而且在外观上和速度上与使用C/C++等语言在操作系统平台上开发出来的本地图形程序毫无差距,还可以使用鼠标拖放操作、系统托盘等高级的系统服务。

要实现本地化的效果,程序一定要与本地图形系统发生交互,在与操作系统交互时,SWT使用JNI技术。JNI(Java Native Interface)是以前sun公司为Java语言设计的用来与C/C++程序交互的技术。简单地说,可以将它理解成为将Java语言编写的接口和C语言编写的函数绑定,从而使得调用Java接口就等于调用C函数的技术。使用JNI,也可以在C代码中反向操作Java代码的内容,其工作方式如下:

Java代码:
--------------------------------------------
public static void main(String[] args){
......
method(...);
......
}

//用来声明JNI方法的接口,这个接口可以被其他Java代码调用
//
调用这个Java接口就等于调用下面的C函数
public static native int method(...);
--------------------------------------------
C代码:

//C代码负责JNI方法的具体实现,在这里可以调用操作系统API或执行其他C程序,也可以回调Java程序
JNIEXPORT jint JNICALL Java_JNI_method (JNIEnv *,jclass)....
--------------------------------------------

目前主流的图形平台都提供了C语言的API供开发者使用。出于性能的考虑,SWT并没有在操作系统的API上面再做封装,而是利用JNI将它们一对一地映射到Java平台上。这些JNI函数的访问权限都被限制在了SWT的包内部,外部程序只能通过SWT的API使用它们,不能直接调用。针对不同的图形平台,JNI接口也各不相同,SWT API的任务就是封装这些不同点。这些API将基本的图形操作进行抽象,并将不同的JNI调用封装在内部,从而以一致的接口呈现给使用者。使用SWT开发,主要就是操作这些API。

------------
SWT的基本体系结构共分为三层:
1)第一层是SWT的API。
外部开发者使用SWT时就是使用这些API编写SWT程序。这里包含了SWT的控件(文本框,按钮等)、事件处理(各种事件及监听器)等和图形界面开发者关系最为密切的部分;同时也只有这一部分的代码对外部开发者可见。底层C语言风格的API,在这一层上被封装为对象供外部开发者使用,但在封装的具体实现代码上,对于不同系统平台会有微小的差别。比如Win32平台的SWT在打开一个窗口时会针对WinCE和WindowsXP的特殊情况做不同的处理,而Linux GTK图形平台的SWT则没有这段代码。从整体上看,这部分代码在不同平台上基本相似。

2)第二层是JNI相关的代码。
每一个操作系统提供的API都拥有自己定义的一系列独特的数据类型作为参数类型及返回值。这一层的代码除了包含对应到C函数的Java接口外,还有这些特殊数据类型用Java实现。这一层的代码只在SWT内部可见,虽然也是Java编写,但其内容在每一种SWT版本中都是完全不同的。

3)第三层是使用C语言编写的操作系统本地动态链接库文件。
这些库文件将操作系统上和图形界面相关的C语言的API封装成Java可以调用的形式。这一层的代码全部是由C语言编写的,在Windows平台上编译成DLL文件,而在Linux平台上则编译为so文件。

在Windows XP上SWT调用操作系统API以创建一个窗口的函数调用过程如下。具体的创建窗口工作比下面显示的要略微复杂一些,还包括为窗口注册回调函数等其他内容,这里只列出了其中的部分核心流程。



(SWT的三层结构--SWT API;JNI Interface & Types;Native Library(DLL))

1)开发者通过调用SWT API创建一个窗口实例,并调用它的open方法:shell.open();
2)SWT API 呼叫OS.java中的CreateWindowEx函数以创建一个窗口:OS.createWindowEx
3)通过JNI映射,这个调用被翻译成对动态链接库中对应C函数的调用:OS_NATIVE("CreateWindowEx")
4)动态链接库中的函数调用Win32 API CreateWindowEx,完成窗口创建:Windows XP OS
  • 大小: 5.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics