论坛首页 Java企业应用论坛

Windows 上使用 GCJ+SWT 开发 native GUI 应用

浏览 53274 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-04-04  
ozzzzzz 写道
那为什么dotnet和java会出现呢?并且成为现在开发的主流语意。

牛头不对马嘴!我觉得你这种讨论方式就没有太大意义了。VM提升性能有限,不能等于Java不能使用。Java能使用也不等于VM的性能能够大幅度的提升。这两者之间没有任何逻辑关联.
可以去看看volano的Performance bench mark,主流的JVM无论是ibm,sun,还是jrokit 从1.3.1到1.4有多少性能的提高?再看后面更为夸张的net work Scalability 的测试,BEA和Black down在performance的测试一塌糊涂,而在网络测试中却以1万个connection遥遥领先。除了采用本地化的Thin Threads方法没有可能达到这样的效果。VM的性能提高是非常有限的。无论是基于堆栈的还是基于寄存器的,只要你采用了GC就必须中断用户线程进行垃圾清扫,这是非常基本的常识。中断线程肯定会带来效率的损失,如果不算本地化或者部分本地化,现在的VM提高性能的唯一方法就是怎么样尽量的减少中断.可惜这种做法有的时候又是自作聪明适得其反。一个程序如果长时间的繁忙运行任务,那么GC就很难得到调度,最后就是outofmemory Exception.这个问题在comp.lang.java.programmer跟comp.lang.c++上有过非常清楚地讨论。又要马儿跑得快,又要马儿不吃草这是童话里面才有的事情。所以在Rtjava的规范里面为了突破性能瓶颈才不得不低头采用了scopememory的方案(类似于.Net中的unsafe)。
  至于为何java为何能出现?很大程度上取决于计算机的性能,能够支付起这样的代价。
0 请登录后投票
   发表时间:2004-04-04  
解释语意的唯一出路在于本地化或者部分本地化吗?java的流行很好的说明了这个问题,只要硬件可以支持部分的开销,解释化的语言可以很好的得到应用。当然vm的技术提高也有很多帮助,但是java等语言的运行还是以赖与vm而不可能去大面积本地化来提高效率。解释化语言之所以还是解释化的语言,就是是看它的运行是不是依靠解释器,还是直接可以本地化成为直接运行的程序。这个还要争论,我就实在不知道说什么好。
vm中实现对于解释化语言的运行肯定要本地化为机器命令,这点不用讨论。但是这些对于解释化语言的解释技术难道就是解释化语言的本地化?如果如此从来就没有存在过什么解释化语言。你可以对于解释化语言进行预编译,把部分段本地化存储在缓存中,这只是vm的实现技术,不是解释化语言的本地化。
0 请登录后投票
   发表时间:2004-04-04  
ozzzzzz 写道
解释语意的唯一出路在于本地化或者部分本地化吗?java的流行很好的说明了这个问题,只要硬件可以支持部分的开销,解释化的语言可以很好的得到应用。当然vm的技术提高也有很多帮助,但是java等语言的运行还是以赖与vm而不可能去大面积本地化来提高效率。解释化语言之所以还是解释化的语言,就是是看它的运行是不是依靠解释器,还是直接可以本地化成为直接运行的程序。这个还要争论,我就实在不知道说什么好。
vm中实现对于解释化语言的运行肯定要本地化为机器命令,这点不用讨论。但是这些对于解释化语言的解释技术难道就是解释化语言的本地化?如果如此从来就没有存在过什么解释化语言。你可以对于解释化语言进行预编译,把部分段本地化存储在缓存中,这只是vm的实现技术,不是解释化语言的本地化。

在VM中速度和内存的冗余成反比关系,你要提高速度就要牺牲内存消耗,你要减少内存消耗就要降低运行速度。因此解释语言是否需要本地化或者部分本地化,这是无可争议的事情。从Java 1.4开始已近相当的明显,很多新加入的库,例如nio的buffer都是采用了本地化的方法。这与存储在缓存中是两码事情,比较一下byte数组和ByteBuffer地实现。前者通过解释->JIT缓存成本地代码的方法加快速度,而byteBuffer是直接通过JNI调用本地的alloc,memcopy。在blackdown,jrocket的线程库中为了提高线程的效率,直接使用本地thread。在rtjava规范里面更加大胆的限制了GC的使用,采用scopememory的方法来申请和管理内存。我的观点是,当解释语言无法突破性能瓶颈的时候,本地化和部分本地化是唯一的出路。硬件性能的提高的确是支付了一些代价,但是现在越来越多的现实是很多情况下为了提升速度所支付的硬件代价已经相当的不划算。
在客户端SWT,windowsform是活生生的例子98年推出的swing到现在硬件的速度已经翻了10倍按理说swing的使用已经不成问题,可惜swing仍然是一个鸡肋速度仍然是无法忍受,为十么?在服务端的,java1.4的为了配合nio而使用bytebuffer也更加耐人寻味。
0 请登录后投票
   发表时间:2004-04-04  
是的,本地化的代码会带来高速度,但是解释化语言依然成为了发展的主流,而不会倒退到本地化语言的老路上去。你说的这些都是vm的本地化,都是针对解释化语言程序更好的解释的技术,而不是针对解释化语言本地化的技术。SWT是调用本地化的标准接口,但是它依然是为解释化语言服务的,而不是为本地化语言服务的。本地化的语言不需要这样的东西,他们可以直接去调用他们想调用的东西。nio也好jni也罢,这些技术并不是要你把java去本地化,而是更好的使语言更容易成为解释性的语言,而不是相反。
硬件的速度现在发展大大高于软件的速度,而许多原来的瓶茎已经被打破。当我们开始谈论解释化语言的时候,主流的声音是解释化的语言只能是学习语言的工具,或者只能是程序员的玩具。但是看看今天,java和dotnet成为了最热门的程序员语言。本地化的语言会带来效率和功能的强大,但是这些是要付出代价的。而java要做到一次编译到处运行,也是要付出代价的。我们要作的是权衡这个代价,而权衡的结果是主流的声音说解释化语言是编程语言的未来。
0 请登录后投票
   发表时间:2004-04-05  
ozzzzzz 写道
是的,本地化的代码会带来高速度,但是解释化语言依然成为了发展的主流,而不会倒退到本地化语言的老路上去。你说的这些都是vm的本地化,都是针对解释化语言程序更好的解释的技术,而不是针对解释化语言本地化的技术。SWT是调用本地化的标准接口,但是它依然是为解释化语言服务的,而不是为本地化语言服务的。本地化的语言不需要这样的东西,他们可以直接去调用他们想调用的东西。nio也好jni也罢,这些技术并不是要你把java去本地化,而是更好的使语言更容易成为解释性的语言,而不是相反。
硬件的速度现在发展大大高于软件的速度,而许多原来的瓶茎已经被打破。当我们开始谈论解释化语言的时候,主流的声音是解释化的语言只能是学习语言的工具,或者只能是程序员的玩具。但是看看今天,java和dotnet成为了最热门的程序员语言。本地化的语言会带来效率和功能的强大,但是这些是要付出代价的。而java要做到一次编译到处运行,也是要付出代价的。我们要作的是权衡这个代价,而权衡的结果是主流的声音说解释化语言是编程语言的未来。

所以说我们在讨论两件事情,牛头不对马嘴
0 请登录后投票
   发表时间:2004-04-05  
所以还是要用脚后跟思考问题了。
0 请登录后投票
   发表时间:2005-01-03  
http://www.thisiscool.com/gcc_mingw.htm 下载的 gcj 3.4.0 是可以支持 dynamic link 的,就是说可以把 Java 程序编译为一个 .dll。另外中文支持的问题可以通过使用 native2ascii 工具和 ResourceBundle 来部分解决。现在 MinGW 官方下载的 gcj 3.4.2 不支持 dynamic link,而这个 thisiscool 版本的 gcj 3.4.0 又不支持使用 iconv 来做字符集转换。如果两个功能可以合并,推出一个新的版本,那么 gcj 就是一个非常棒的工具了。我尝试过在 Windows 上使用 MinGW+MSYS 编译 GCC 3.4.0(完整的 GCC,包括 gcc、g++、g77、gcj、etc.),但是没有取得成功,估计还是需要在 Cygwin 环境下来做这件事情,不过我没有时间做了。

以上讨论的全部是关于 gcj for Win32 的,gcj for Linux 完全不存在上述两个问题,现在就已经是一个非常成熟的工具了。

附件是我写的一个将 Java 程序编译为 .dll 并且调用其功能,并且部分解决了中文支持的例子,感兴趣的可以玩玩。

首先保证下载并且安装好了 thisiscool 版本的 gcj 3.4.0,然后
编译、链接:
c.bat
运行:
Hello.exe

Have fun!
0 请登录后投票
   发表时间:2006-07-27  
dlee 写道
我提的这两个问题 Mohan Embar 老兄看来都已经解决掉了。这里有最新版本的 GCJ for Windows 和 SWT。
http://www.thisiscool.com/gcc_mingw.htm
http://gcc.gnu.org/ml/java/2003-11/msg00272.html
http://gcc.gnu.org/ml/java-patches/2003-q4/msg00438.html
我将考察 Mohan Embar 所做的 patch,并且在解决完上述问题后把所有的经验写入这个教程。


有没有编译好的 lib-org-eclipse-swt.a 啊?能否共享一个,我用 windows2000,是不是需要 windows2000下编译好的 lib-org-eclipse-swt.a?
因为我用上面说得命令 build这个 lib-org-eclipse-swt.a 的时候,报错了,build没有成,错误信息:
E:\jtools\thisiscool-gcc-34\test_swt_native\Library>java org.apache.tools.ant.Ma
in -Dos=win32 -Dwindow_system=win32
Buildfile: build.xml

get-swt-source:

properties:

init:

ws/win32/swtsrc.zip:
      [zip] Building zip: E:\jtools\thisiscool-gcc-34\test_swt_native\Eclipse_2.
0.2_SWT_Source\plugins\org.eclipse.swt.win32\ws\win32\swtsrc.zip
    [unzip] Expanding: E:\jtools\thisiscool-gcc-34\test_swt_native\Eclipse_2.0.2
_SWT_Source\plugins\org.eclipse.swt.win32\ws\win32\swtsrc.zip into E:\jtools\thi
siscool-gcc-34\test_swt_native\Library

patch:

compile:
    [javac] Compiling 4 source files
     [echo] Compiling SWT with GCJ

static-up-to-date:

static-library:

BUILD FAILED
E:\jtools\thisiscool-gcc-34\test_swt_native\Library\build.xml:229: Execute faile
d: java.io.IOException: CreateProcess: ar rcs lib-org-eclipse-swt.a org\eclipse\
swt\SWT.o org\eclipse\swt\SWTError.o org\eclipse\swt\SWTException.o org\eclipse\
swt\accessibility\ACC.o org\eclipse\swt\accessibility\Accessible.o org\eclipse\s
wt\accessibility\AccessibleAdapter.o org\eclipse\swt\accessibility\AccessibleCon
trolAdapter.o org\eclipse\swt\accessibility\AccessibleControlEvent.o org\eclipse
\swt\accessibility\AccessibleControlListener.o org\eclipse\swt\accessibility\Acc
essibleEvent.o org\eclipse\swt\accessibility\AccessibleListener.o org\eclipse\sw
t\custom\AnimatedProgress.o org\eclipse\swt\custom\BidiSegmentEvent.o org\eclips
e\swt\custom\BidiSegmentListener.o org\eclipse\swt\custom\BusyIndicator.o org\ec
lipse\swt\custom\CCombo.o org\eclipse\swt\custom\CLabel.o org\eclipse\swt\custom
\CTabFolder.o org\eclipse\swt\custom\CTabFolderAdapter.o org\eclipse\swt\custom\
CTabFolderEvent.o org\eclipse\swt\custom\CTabFolderListener.o org\eclipse\swt\cu
stom\CTabItem.o org\eclipse\swt\custom\ControlEditor.o org\eclipse\swt\custom\De
faultCon?

Total time: 53 seconds


我用的版本是 GCJ34的,应该没有问题,这个错误可能是由于 windows的cmd中的变量不能太多? 这些 *.o的变量已经超过允许的最大长度了,所以把最后放不下的 DefaultContent类认成了 DefaultCon? 
0 请登录后投票
   发表时间:2006-07-29  
dlee 写道
http://www.thisiscool.com/gcc_mingw.htm 下载的 gcj 3.4.0 是可以支持 dynamic link 的,就是说可以把 Java 程序编译为一个 .dll。另外中文支持的问题可以通过使用 native2ascii 工具和 ResourceBundle 来部分解决。现在 MinGW 官方下载的 gcj 3.4.2 不支持 dynamic link,而这个 thisiscool 版本的 gcj 3.4.0 又不支持使用 iconv 来做字符集转换。如果两个功能可以合并,推出一个新的版本,那么 gcj 就是一个非常棒的工具了。我尝试过在 Windows 上使用 MinGW+MSYS 编译 GCC 3.4.0(完整的 GCC,包括 gcc、g++、g77、gcj、etc.),但是没有取得成功,估计还是需要在 Cygwin 环境下来做这件事情,不过我没有时间做了。

以上讨论的全部是关于 gcj for Win32 的,gcj for Linux 完全不存在上述两个问题,现在就已经是一个非常成熟的工具了。

附件是我写的一个将 Java 程序编译为 .dll 并且调用其功能,并且部分解决了中文支持的例子,感兴趣的可以玩玩。

首先保证下载并且安装好了 thisiscool 版本的 gcj 3.4.0,然后
编译、链接:
c.bat
运行:
Hello.exe

Have fun!


搭建好环境后,运行  c.bat出错:
E:\eclipse3.2\DllTest>c.bat

E:\eclipse3.2\DllTest>call c0 hello

E:\eclipse3.2\DllTest>native2ascii -encoding 8859_1 hello.properties1 hello.prop
erties

E:\eclipse3.2\DllTest>call c1 DllTest

E:\eclipse3.2\DllTest>gcj -c -o DllTest.o DllTest.java

E:\eclipse3.2\DllTest>dlltool --output-def DllTest.def --export-all-symbols DllT
est.o

E:\eclipse3.2\DllTest>gcj -shared -s -o DllTest.dll -Wl,--out-implib=libDllTest.
a DllTest.o DllTest.def
Creating library file: libDllTest.a

E:\eclipse3.2\DllTest>call c2 Hello DllTest

E:\eclipse3.2\DllTest>gcj --main=Hello -s -o Hello.exe Hello.java -L. -lDllTest

Info: resolving __Jv_Compiler_Properties by linking to __imp___Jv_Compiler_Prope
rties (auto-import);
Info: resolving __ZN4java4lang6System6class$E by linking to __imp___ZN4java4lang
6System6class$E (auto-import);
C:\DOCUME~1\ADMINI~1.LIY\LOCALS~1\Temp/cc4gbaaa.o(.text+0x9);: In function `ZN5He
llo4mainEP6JArrayIPN4java4lang6StringEE':
E:/eclipse3.2/DllTest/Hello.java:11: variable 'java::lang::System::class$' can't
 be auto-imported. Please read the documentation for ld's --enable-auto-import f
or details.
Info: resolving __ZN7DllTest6class$E by linking to __imp___ZN7DllTest6class$E (a
uto-import);
Info: resolving __ZN4java4lang6System3outE by linking to __imp___ZN4java4lang6Sy
stem3outE (auto-import);
Info: resolving __ZTVN4java4lang5ClassE by linking to __imp___ZTVN4java4lang5Cla
ssE (auto-import);
C:\DOCUME~1\ADMINI~1.LIY\LOCALS~1\Temp/cc4gbaaa.o(.data+0xa0);:E:/eclipse3.2/DllT
est/Hello.java:13: variable 'vtable for java::lang::Class' can't be auto-importe
d. Please read the documentation for ld's --enable-auto-import for details.
E:/jtools/thisiscool-gcc-34/thisiscool-gcc/gcc-3.4/bin/../lib/gcc/i686-pc-mingw3
2/3.4.0/../../../../i686-pc-mingw32/lib/libswtimgloader.a(SWTImageLoaders.o);(.da
ta+0x80);:SWTImageLoaders.java: variable 'vtable for java::lang::Class' can't be
auto-imported. Please read the documentation for ld's --enable-auto-import for d
etails.
Info: resolving __ZN4java4lang6Object6class$E by linking to __imp___ZN4java4lang
6Object6class$E (auto-import);
Info: resolving __ZN3org7eclipse3swt8internal5image13GIFFileFormat6class$E by li
nking to __imp___ZN3org7eclipse3swt8internal5image13GIFFileFormat6class$E (auto-
import);
Info: resolving __ZN3org7eclipse3swt8internal5image13PNGFileFormat6class$E by li
nking to __imp___ZN3org7eclipse3swt8internal5image13PNGFileFormat6class$E (auto-
import);
Info: resolving __ZN3org7eclipse3swt8internal5image14JPEGFileFormat6class$E by l
inking to __imp___ZN3org7eclipse3swt8internal5image14JPEGFileFormat6class$E (aut
o-import);
Info: resolving __ZN3org7eclipse3swt8internal5image16WinBMPFileFormat6class$E by
 linking to __imp___ZN3org7eclipse3swt8internal5image16WinBMPFileFormat6class$E
(auto-import);
Info: resolving __ZN3org7eclipse3swt8internal5image16WinICOFileFormat6class$E by
 linking to __imp___ZN3org7eclipse3swt8internal5image16WinICOFileFormat6class$E
(auto-import);

从错误看来,环境是没问题的,但是提示说什么 没有 auto-import,这个问题该怎麽修正啊? 
0 请登录后投票
   发表时间:2006-07-30  
dlee 写道
robbin 在前一篇文章中遇到的问题确实是带有普遍性的问题。目前已经有几个项目把一些常用的工具用 GCJ 编译为本地版本。例如:
RHUG:http://sources.redhat.com/rhug/
NAOKO:http://people.redhat.com/gbenson/naoko/

我们看到,一些常用的工具如 Ant、JUnit、Tomcat、MySQL-JDBC、PostgreSQL-JDBC、Struts、Xerces、Xalan 都已经编译成了 native 的版本。前些时候我们还听说有人把 Eclipse 完全编译成了 native 的版本。
所以有一天我给你一个 ant.exe 或者 tomcat.exe 你可别大惊小怪。

不过本地编译在一个较长的时间内是无法取代 JVM 的。它只能作为 JVM 的补充,并且给我们带来了很多编程的乐趣。Just for fun! 呵呵。


那两个网址里面都没有 mysql 的driver啊?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics