`
djsl6071
  • 浏览: 595280 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

在Windows下使用GCJ+SWT的实例

阅读更多

Windows下使用GCJ+SWT的实例

GCJ可以把JAVA程序编译成本地代码,编译成功后的exe文件不再需要JRE就可直接运行,编译成本地后的程序运行速度有所提高。缺点是生成后的文件较大,我试了一个hello world都要两兆多,用WinRAR压缩后为600K

<o:p> </o:p>

安装及配置

1.       下载MinGW(http://sourceforge.net/projects/mingw )

网址:http://sourceforge.net/project/showfiles.php?group_id=2435

需要下载下列文件:

MinGW-2.0.0-3.exe (Windows下的GNU环境)

MSYS-1.0.8.exe (一个模拟的*nix 支持shell等)

gcj-3.2-20021210-1.tar.gz (主角GCJ编译java为本地代码)

2.       安装文件

依次安装MinGW-2.0.0-3.exeMSYS-1.0.8.exe

安装MSYS时会有提示要你输入MinGW的路径。

解压缩gcj-3.2-20021210-1.tar.gz将里面的文件复制到MinGW下,注意对应文件夹,比如gcj\bin下文件要放到对应的MinGW\bin下面。

<o:p> </o:p>

3.       设置WindowsPATHMinGW\bin加到系统的PATH里,方便以后运行gcj

<o:p> </o:p>

然后在命令行里输入gcj –v 看看吧:)

HelloGCJ.exe

为了方便描述,让我们先建立一个gcjwork文件夹,

gcjwork中建立一个普通的java源文件,HelloGCJ.java

public class HelloGCJ {<o:p></o:p>

    public static void main(String[] args) {<o:p></o:p>

        System.out.println("Hello GCJ!");<o:p></o:p>

    }<o:p></o:p>

}<o:p></o:p>

同目录下新建一个文本文件Makefile注意不要带扩展名。

TARGET=HelloGCJ<o:p></o:p>

GCJ=gcj<o:p></o:p>

<o:p> </o:p>

all: $(TARGET)<o:p></o:p>

<o:p> </o:p>

$(TARGET): $(TARGET).o<o:p></o:p>

       $(GCJ) --main=$(TARGET) -o $(TARGET) $(TARGET).o<o:p></o:p>

<o:p> </o:p>

$(TARGET).o: $(TARGET).java<o:p></o:p>

       $(GCJ) -c $(TARGET).java -o $(TARGET).o<o:p></o:p>

<o:p> </o:p>

.PHONY: clean<o:p></o:p>

<o:p> </o:p>

clean:<o:p></o:p>

       rm -rf *.o $(TARGET)<o:p></o:p>

<o:p> </o:p>

然后让我们打开MSYS使用cd进入到我们建立的gcjwork下,输入make

之后即可生成一个HelloGCJ.exe,运行他,这可是一个没有用虚拟机的用java写的程序哦。:)

<o:p> </o:p>

对比一下

为什么要把java便以成本地代码呢?

执行速度加快是一个很主要的特点,让我们做一个最最简单的对比。

还是上例的HelloGCJ,我们编译成javabytecode

注意gcj也可以编译bytecode,

使用gcj –C HelloGCJ.java 命令即可。

然后对比运行两个程序,在我的机器上可以明显感觉到HelloGCJ.class在执行时顿了一下。

HelloGCJ.exe则直接相应输出了文字。

<o:p> </o:p>

<o:p> </o:p>

再来搞搞SWT

      

用过Eclipse就知道SWTSWTIBM的图形界面开发包,因为它的实现也是与本地化有关,所以引来不少的争议,公说公有理婆说婆有理,我们就不说什么了,直接说怎么使用它,毕竟是好是坏,用了才知道!

<o:p> </o:p>

       准备<o:p></o:p>

       1swt.jat (SWTjava包,编译java要用)<o:p></o:p>

       2SWTwindows版本对应的dll(我的的文件名是swt-win32-2133.dll)

       上面这两个文件可以在eclipse下载最新的SWT工具包

       http://download2.eclipse.org/downloads/drops/R-2.1-200303272130/swt-2.1-win32.zip

<o:p> </o:p>

       3.用于编译exelibswt.a文件(我生成了一个,在这里下载)

       http://www.elvala.com/download/java/libswt.rar

<o:p> </o:p>

       开始<o:p></o:p>

       我们使用的是eclipse的例子程序,源代码如下:

<o:p> </o:p>

import org.eclipse.swt.*;<o:p></o:p>

import org.eclipse.swt.widgets.*;<o:p></o:p>

import org.eclipse.swt.layout.*;<o:p></o:p>

import org.eclipse.swt.events.*;<o:p></o:p>

import org.eclipse.swt.graphics.*;<o:p></o:p>

 <o:p></o:p>

public class ComplexGridLayoutExample {<o:p></o:p>

   static Display display;<o:p></o:p>

   static Shell shell;<o:p></o:p>

   static Text dogName;<o:p></o:p>

   static Combo dogBreed;<o:p></o:p>

   static Canvas dogPhoto;<o:p></o:p>

   static Image dogImage;<o:p></o:p>

   static List categories;<o:p></o:p>

   static Text ownerName;<o:p></o:p>

   static Text ownerPhone;<o:p></o:p>

 <o:p></o:p>

   public static void main(String[] args) {<o:p></o:p>

       display = new Display();<o:p></o:p>

       shell = new Shell(display);<o:p></o:p>

       shell.setText("Dog Show Entry");<o:p></o:p>

       GridLayout gridLayout = new GridLayout();<o:p></o:p>

       gridLayout.numColumns = 3;<o:p></o:p>

       shell.setLayout(gridLayout);<o:p></o:p>

     <o:p></o:p>

       new Label(shell, SWT.NONE).setText("Dog's Name:");<o:p></o:p>

       dogName = new Text(shell, SWT.SINGLE | SWT.BORDER);<o:p></o:p>

       GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);<o:p></o:p>

       gridData.horizontalSpan = 2;<o:p></o:p>

       dogName.setLayoutData(gridData);<o:p></o:p>

 <o:p></o:p>

       new Label(shell, SWT.NONE).setText("Breed:");<o:p></o:p>

       dogBreed = new Combo(shell, SWT.NONE);<o:p></o:p>

       dogBreed.setItems(new String [] {"Collie", "Pitbull", "Poodle", "Scottie"});<o:p></o:p>

       dogBreed.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));<o:p></o:p>

 <o:p></o:p>

       Label label = new Label(shell, SWT.NONE);<o:p></o:p>

       label.setText("Categories");<o:p></o:p>

       label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));<o:p></o:p>

      <o:p></o:p>

       new Label(shell, SWT.NONE).setText("Photo:");<o:p></o:p>

       dogPhoto = new Canvas(shell, SWT.BORDER);<o:p></o:p>

       gridData = new GridData(GridData.FILL_BOTH);<o:p></o:p>

       gridData.widthHint = 80;<o:p></o:p>

       gridData.heightHint = 80;<o:p></o:p>

       gridData.verticalSpan = 3;<o:p></o:p>

       dogPhoto.setLayoutData(gridData);<o:p></o:p>

       dogPhoto.addPaintListener(new PaintListener() {<o:p></o:p>

          public void paintControl(final PaintEvent event) {<o:p></o:p>

              if (dogImage != null) {<o:p></o:p>

                 event.gc.drawImage(dogImage, 0, 0);<o:p></o:p>

              }<o:p></o:p>

          }<o:p></o:p>

       });<o:p></o:p>

 <o:p></o:p>

       categories = new List(shell, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);<o:p></o:p>

       categories.setItems(new String [] {<o:p></o:p>

          "Best of Breed", "Prettiest Female", "Handsomest Male",<o:p></o:p>

          "Best Dressed", "Fluffiest Ears", "Most Colors",<o:p></o:p>

          "Best Performer", "Loudest Bark", "Best Behaved",<o:p></o:p>

          "Prettiest Eyes", "Most Hair", "Longest Tail",<o:p></o:p>

          "Cutest Trick"});<o:p></o:p>

       gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);<o:p></o:p>

       gridData.verticalSpan = 4;<o:p></o:p>

       int listHeight = categories.getItemHeight() * 12;<o:p></o:p>

       Rectangle trim = categories.computeTrim(0, 0, 0, listHeight);<o:p></o:p>

       gridData.heightHint = trim.height;<o:p></o:p>

       categories.setLayoutData(gridData);<o:p></o:p>

      <o:p></o:p>

       Button browse = new Button(shell, SWT.PUSH);<o:p></o:p>

       browse.setText("Browse...");<o:p></o:p>

       gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);<o:p></o:p>

       gridData.horizontalIndent = 5;<o:p></o:p>

       browse.setLayoutData(gridData);<o:p></o:p>

       browse.addSelectionListener(new SelectionAdapter() {<o:p></o:p>

          public void widgetSelected(SelectionEvent event) {<o:p></o:p>

              String fileName = new FileDialog(shell).open();<o:p></o:p>

              if (fileName != null) {<o:p></o:p>

                 dogImage = new Image(display, fileName);<o:p></o:p>

              }<o:p></o:p>

          }<o:p></o:p>

       });<o:p></o:p>

      <o:p></o:p>

       Button delete = new Button(shell, SWT.PUSH);<o:p></o:p>

       delete.setText("Delete");<o:p></o:p>

       gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);<o:p></o:p>

       gridData.horizontalIndent = 5;<o:p></o:p>

       delete.setLayoutData(gridData);<o:p></o:p>

       delete.addSelectionListener(new SelectionAdapter() {<o:p></o:p>

          public void widgetSelected(SelectionEvent event) {<o:p></o:p>

              if (dogImage != null) {<o:p></o:p>

                 dogImage.dispose();<o:p></o:p>

                 dogImage = null;<o:p></o:p>

                 dogPhoto.redraw();<o:p></o:p>

              }<o:p></o:p>

          }<o:p></o:p>

       });<o:p></o:p>

      <o:p></o:p>

       Group ownerInfo = new Group(shell, SWT.NONE);<o:p></o:p>

       ownerInfo.setText("Owner Info");<o:p></o:p>

       gridLayout = new GridLayout();<o:p></o:p>

       gridLayout.numColumns = 2;<o:p></o:p>

       ownerInfo.setLayout(gridLayout);<o:p></o:p>

       gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);<o:p></o:p>

       gridData.horizontalSpan = 2;<o:p></o:p>

       ownerInfo.setLayoutData(gridData);<o:p></o:p>

      <o:p></o:p>

       new Label(ownerInfo, SWT.NONE).setText("Name:");<o:p></o:p>

       ownerName = new Text(ownerInfo, SWT.SINGLE | SWT.BORDER);<o:p></o:p>

       ownerName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));<o:p></o:p>

      <o:p></o:p>

       new Label(ownerInfo, SWT.NONE).setText("Phone:");<o:p></o:p>

       ownerPhone = new Text(ownerInfo, SWT.SINGLE | SWT.BORDER);<o:p></o:p>

       ownerPhone.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));<o:p></o:p>

      <o:p></o:p>

       Button enter = new Button(shell, SWT.PUSH);<o:p></o:p>

       enter.setText("Enter");<o:p></o:p>

       gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);<o:p></o:p>

       gridData.horizontalSpan = 3;<o:p></o:p>

       enter.setLayoutData(gridData);<o:p></o:p>

       enter.addSelectionListener(new SelectionAdapter() {<o:p></o:p>

          public void widgetSelected(SelectionEvent event) {<o:p></o:p>

              System.out.println("\nDog Name: " + dogName.getText());<o:p></o:p>

              System.out.println("Dog Breed: " + dogBreed.getText());<o:p></o:p>

              System.out.println("Owner Name: " + ownerName.getText());<o:p></o:p>

              System.out.println("Owner Phone: " + ownerPhone.getText());<o:p></o:p>

              System.out.println("Categories:");<o:p></o:p>

              String cats[] = categories.getSelection();<o:p></o:p>

              for (int i = 0; i < cats.length; i++) {<o:p></o:p>

                 System.out.println("\t" + cats[i]);<o:p></o:p>

              }<o:p></o:p>

          }<o:p></o:p>

       });<o:p></o:p>

      <o:p></o:p>

       shell.pack();<o:p></o:p>

       shell.open();<o:p></o:p>

       while (!shell.isDisposed()) {<o:p></o:p>

          if (!display.readAndDispatch()) display.sleep();<o:p></o:p>

       }<o:p></o:p>

       if (dogImage != null) {<o:p></o:p>

          dogImage.dispose();<o:p></o:p>

       }<o:p></o:p>

   }<o:p></o:p>

}<o:p></o:p>

       <o:p></o:p>

<o:p> </o:p>

       文件存为ComplexGridLayoutExample.java<o:p></o:p>

       对应的Makefile 文件

<o:p> </o:p>

TARGET=ComplexGridLayoutExample<o:p></o:p>

GCJ=gcj<o:p></o:p>

JFLAGS=--classpath=./swt.jar<o:p></o:p>

LFLAGS=-L. -lswt<o:p></o:p>

<o:p> </o:p>

all: $(TARGET)<o:p></o:p>

<o:p> </o:p>

$(TARGET): $(TARGET).o<o:p></o:p>

       $(GCJ) --main=$(TARGET) -o $(TARGET) $(TARGET).o $(LFLAGS)<o:p></o:p>

<o:p> </o:p>

$(TARGET).o: $(TARGET).java<o:p></o:p>

       $(GCJ) $(JFLAGS) -c $(TARGET).java -o $(TARGET).o<o:p></o:p>

.PHONY: clean<o:p></o:p>

<o:p> </o:p>

clean:<o:p></o:p>

       rm -rf *.o $(TARGET)<o:p></o:p>

<o:p> </o:p>

       上面两个文件和swt.jar,libswt.a,swt-win32-2133.dll 放在一起,

       关于路径问题注意

       JFLAGS=--classpath=./swt.jar<o:p></o:p>

LFLAGS=-L. –lswt<o:p></o:p>

其中JFLAGS要对应swt.jar

LFLAGS要对应libswt.a

<o:p> </o:p>

然后make!

运行生成的ComplexGridLayoutExample.exe

看到了吗?以后运行此程序只要和swt-win32-2133.dll在一起。

整个exe大概5兆多,似乎有些让人沮丧,太大啦,但是这东西的确很奇妙,

据说C# editor:SharpStudio将使用SWT来制作!SWT封装了很多功能,你会发现写应用程序会比使用Swing等要方便很多。

 

直接下载编译好的例子 ComplexGridLayoutExample.exe

http://www.elvala.com/download/java/gcj.rar 

分享到:
评论

相关推荐

    MinGW gcc g++ gcj gdb for windows part2

    MinGW gcc g++ gcj gdb for windows part2

    GCJ02转WGS84

    Java代码可以实现这个转换,使得在GCJ02坐标下的位置数据能够与WGS84坐标系统下的数据对应起来,这对于开发需要跨系统的地理应用,如地图定位、轨迹分析等非常有用。 在提供的压缩包中,`axisoffset.dat`可能是一个...

    gcj.pdf

    根据提供的文件信息,我们可以推断出这是一份关于GNU gcj(GNU Compiler for the Java Programming Language)...无论是新手还是有经验的开发者,都能从中获取到有用的知识点,帮助他们在使用gcj的过程中更加得心应手。

    57.(leaflet篇)leaflet高德坐标转天地图坐标(gcj02转大地2000).zip

    本话题主要聚焦于如何在Leaflet中实现高德坐标(GCJ-02)到天地图坐标(CGCS2000,也称为大地2000)的转换。下面我们将详细探讨这个过程。 首先,我们来理解一下GCJ-02和CGCS2000这两个坐标系统。GCJ-02,又称为...

    BD09 坐标 WGS84 坐标 GCJ02 坐标的相互转换

    3. **BD09坐标系统**:百度地图使用的坐标系统,是在GCJ02基础上进一步加密的结果,增加了更精确的定位能力。 对于这三种坐标系的转换,主要涉及以下几个过程: **WGS84到GCJ02的转换**: 这个转换通常被称为"偏移...

    Cloudera Impalad分布式群集部署(yum本地源+代码实例)

    本文将详细介绍如何在 Centos 6.xx 64 位系统环境下部署基于 Cloudera Impala 的分布式集群,包括系统准备、JDK 安装、主机名修改、SSH 无密码访问配置、防火墙及 SELINUX 关闭、NTP 服务安装等步骤,并结合 yum ...

    wgs84转gcj02/gcj02转wgs84

    GPS经纬度偏移java端实现,wgs84转gcj02/gcj02转wgs84,亲测有效,稍微有点小偏差!

    WGS84、GCJ02、BD09坐标系shp数据的互转工具合集

    6. **BD09转GCJ02**:将百度坐标转换回火星坐标,以便在非百度地图服务上使用。 每个程序独立运行,用户可根据具体需求选择相应工具进行坐标转换。这种灵活性对于处理不同来源和目标系统的地理数据非常实用,可以...

    WGS84、GCJ02、BD09坐标系shp数据的互转.docx

    通过这款工具,用户可以在无需GIS软件的情况下轻松完成WGS84、GCJ02、BD09坐标系shp数据之间的转换工作,不仅简化了操作流程,还大大提高了数据处理的效率。无论是GIS专业人士还是普通用户,都能从中受益。对于经常...

    WGS84坐标间距离计算,WGS84转火星坐标gcj02,火星坐标转百度坐标BD09

    WGS84坐标间距离计算,WGS84转火星坐标gcj02,火星坐标转百度坐标BD09. function gcj02ToBd09(gg_lat, gg_lon: double): TLaLoDegPoint; //火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换...

    Go-坐标转换工具提供WGS84GCJ02百度坐标系的相互转换

    - **百度坐标系**:百度地图使用的一种特定坐标系,是在GCJ02基础上进行二次加密的结果,以适应其特定的算法和服务需求。 2. **坐标转换的原理** - **WGS84到GCJ02**:主要通过双线性映射算法,对经纬度进行一定...

    iOS调起高德/百度/腾讯/谷歌/苹果地图并使用GCJ02坐标进行导航

    这通常涉及到坐标转换,因为中国的地图API通常使用GCJ02(国测局02)坐标系,而国际上广泛使用的是WGS84坐标系。本文将深入探讨如何在iOS中调用这些地图应用并进行GCJ02坐标系的导航。 首先,GCJ02坐标系是中国特有...

    GPS轨迹坐标转换(WGS84转GCJ02转web墨卡托).txt

    GIS空间坐标系,WGS84经纬度,先转GCJ02国测02,再转web墨卡托的代码。项目中用到的分享给大家

    GCJ2gps.bas

    VB源码,火星坐标系(GCJ-02)转WGS84源代码 并经过测试,可用。

    中国地球(WGS-84)和火星(GCJ-02)的输运坐标

    在开发地图应用或处理中国地区的定位数据时,了解并正确使用WGS-84和GCJ-02之间的转换至关重要。例如,如果你正在构建一个需要在中国运行的定位服务,必须确保在用户设备获取的WGS-84坐标和服务器端处理的GCJ-02坐标...

    gcj02与wgs84的相互转换 js代码

    gcj02与wgs84的相互转换 js代码 高德 百度,腾讯等与wgs84坐标的转换方法

    收集的java坐标转换WGS84、GCJ02B、BD09及纠偏

    **坐标纠偏**通常是指在从GPS设备获取到原始WGS84坐标后,将其转换为GCJ-02或BD-09坐标的过程,因为在国内,直接使用WGS84坐标可能会导致位置信息的不准确。在`CoordinateConvert.java`文件中,可能包含将WGS84坐标...

    一个提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具模块。

    例如,如果你正在开发一个在中国运行的定位应用,用户的位置信息可能来自不同的设备和平台,它们可能会使用WGS84、GCJ02或BD09坐标。通过这个模块,你可以确保所有位置数据都能统一到同一坐标系,从而正确地在地图上...

    腾讯地图GCJ02坐标与百度BD09坐标相互转换

    腾讯地图GCJ02坐标与百度BD09坐标相互转换 GCJ02坐标系:即火星坐标系,WGS84坐标系经加密后的坐标系。 BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系。

    坐标拾取器【内置GCJ02转换WGS84坐标系】

    本人开发的坐标拾取工具,可切换街道图和卫星图,内置GCJ02转换WGS84坐标系和坐标反查功能;已被300人的公司广泛使用。良心资源,童叟无欺! 【GIS工具箱】集成了坐标拾取器、坐标系转换工具和随机坐标生成工具;已...

Global site tag (gtag.js) - Google Analytics