在Windows下使用GCJ+SWT的实例
GCJ可以把JAVA程序编译成本地代码,编译成功后的exe文件不再需要JRE就可直接运行,编译成本地后的程序运行速度有所提高。缺点是生成后的文件较大,我试了一个hello world都要两兆多,用WinRAR压缩后为600多K。
<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.exe、MSYS-1.0.8.exe
安装MSYS时会有提示要你输入MinGW的路径。
解压缩gcj-3.2-20021210-1.tar.gz将里面的文件复制到MinGW下,注意对应文件夹,比如gcj\bin下文件要放到对应的MinGW\bin下面。
<o:p> </o:p>
3. 设置Windows的PATH把MinGW\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,我们编译成java的bytecode
注意gcj也可以编译bytecode,
使用gcj –C HelloGCJ.java 命令即可。
然后对比运行两个程序,在我的机器上可以明显感觉到HelloGCJ.class在执行时顿了一下。
而HelloGCJ.exe则直接相应输出了文字。
<o:p> </o:p>
<o:p> </o:p>
再来搞搞SWT
用过Eclipse就知道SWT,SWT是IBM的图形界面开发包,因为它的实现也是与本地化有关,所以引来不少的争议,公说公有理婆说婆有理,我们就不说什么了,直接说怎么使用它,毕竟是好是坏,用了才知道!
<o:p> </o:p>
准备<o:p></o:p>
1.swt.jat (SWT的java包,编译java要用)<o:p></o:p>
2.SWT的windows版本对应的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.用于编译exe的libswt.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
Java代码可以实现这个转换,使得在GCJ02坐标下的位置数据能够与WGS84坐标系统下的数据对应起来,这对于开发需要跨系统的地理应用,如地图定位、轨迹分析等非常有用。 在提供的压缩包中,`axisoffset.dat`可能是一个...
根据提供的文件信息,我们可以推断出这是一份关于GNU gcj(GNU Compiler for the Java Programming Language)...无论是新手还是有经验的开发者,都能从中获取到有用的知识点,帮助他们在使用gcj的过程中更加得心应手。
本话题主要聚焦于如何在Leaflet中实现高德坐标(GCJ-02)到天地图坐标(CGCS2000,也称为大地2000)的转换。下面我们将详细探讨这个过程。 首先,我们来理解一下GCJ-02和CGCS2000这两个坐标系统。GCJ-02,又称为...
本文将详细介绍如何在 Centos 6.xx 64 位系统环境下部署基于 Cloudera Impala 的分布式集群,包括系统准备、JDK 安装、主机名修改、SSH 无密码访问配置、防火墙及 SELINUX 关闭、NTP 服务安装等步骤,并结合 yum ...
3. **BD09坐标系统**:百度地图使用的坐标系统,是在GCJ02基础上进一步加密的结果,增加了更精确的定位能力。 对于这三种坐标系的转换,主要涉及以下几个过程: **WGS84到GCJ02的转换**: 这个转换通常被称为"偏移...
通过这款工具,用户可以在无需GIS软件的情况下轻松完成WGS84、GCJ02、BD09坐标系shp数据之间的转换工作,不仅简化了操作流程,还大大提高了数据处理的效率。无论是GIS专业人士还是普通用户,都能从中受益。对于经常...
GPS经纬度偏移java端实现,wgs84转gcj02/gcj02转wgs84,亲测有效,稍微有点小偏差!
6. **BD09转GCJ02**:将百度坐标转换回火星坐标,以便在非百度地图服务上使用。 每个程序独立运行,用户可根据具体需求选择相应工具进行坐标转换。这种灵活性对于处理不同来源和目标系统的地理数据非常实用,可以...
WGS84坐标间距离计算,WGS84转火星坐标gcj02,火星坐标转百度坐标BD09. function gcj02ToBd09(gg_lat, gg_lon: double): TLaLoDegPoint; //火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换...
这通常涉及到坐标转换,因为中国的地图API通常使用GCJ02(国测局02)坐标系,而国际上广泛使用的是WGS84坐标系。本文将深入探讨如何在iOS中调用这些地图应用并进行GCJ02坐标系的导航。 首先,GCJ02坐标系是中国特有...
- **百度坐标系**:百度地图使用的一种特定坐标系,是在GCJ02基础上进行二次加密的结果,以适应其特定的算法和服务需求。 2. **坐标转换的原理** - **WGS84到GCJ02**:主要通过双线性映射算法,对经纬度进行一定...
GIS空间坐标系,WGS84经纬度,先转GCJ02国测02,再转web墨卡托的代码。项目中用到的分享给大家
VB源码,火星坐标系(GCJ-02)转WGS84源代码 并经过测试,可用。
**坐标纠偏**通常是指在从GPS设备获取到原始WGS84坐标后,将其转换为GCJ-02或BD-09坐标的过程,因为在国内,直接使用WGS84坐标可能会导致位置信息的不准确。在`CoordinateConvert.java`文件中,可能包含将WGS84坐标...
gcj02与wgs84的相互转换 js代码 高德 百度,腾讯等与wgs84坐标的转换方法
腾讯地图GCJ02坐标与百度BD09坐标相互转换 GCJ02坐标系:即火星坐标系,WGS84坐标系经加密后的坐标系。 BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系。
本人开发的坐标拾取工具,可切换街道图和卫星图,内置GCJ02转换WGS84坐标系和坐标反查功能;已被300人的公司广泛使用。良心资源,童叟无欺! 【GIS工具箱】集成了坐标拾取器、坐标系转换工具和随机坐标生成工具;已...
wgs84转GCJ02坐标系(火星坐标系),GCJ02坐标系(火星坐标系)转wgs84坐标系,Python语言
WGS-84 到 GCJ-02 转换算法。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。