2008年10月10日星期五

<转>使用GCJ进行JAVA本地化编译

来源:蓝色冰点
使用GCJ进行JAVA本地化编译
前言:JET是个不错的选择,不过要收费而且还满贵的,试用版的会有一些试用的提示,很不爽,所以就另寻他法了,现在使用的是GUN的GCJ编译。
软件环境:(windows)
MinGW
libiconv(libiconv-1.8-1-lib.zip libiconv-1.8-1-bin.zip)
步骤:
安装MinGW
将libiconv解压缩到MinGW的安装目录
编写JAVA文件并执行
如:Test.java 试生成 Test.class 并测试运行效果
编译为本地文件
如:
必须先将用到的包编译一下,例如gcj -c MyLib.jar,会生成一个 MyLib.o的文件
然后用gcj --classpath=MyLib.jar -c Test.java编译,会生成一个Test.o的文件,
注:如果MyLib.jar中引用到其他包的话 必须先将用到的包编译一下,例如gcj --classpath=MyLib2.jar -c MyLib2.jar 并以此类推。(调用的包的深度比较大的话,很麻烦)
连接为可执行的文件
如:gcj --main=Test --classpath=MyLib.jar -o TestExe Test.class MyLib.o
然后就可以生成一个叫TestExe.exe的文件了(引用比较多的话体积会比较大,运行的效率还不错)

这些只是一个简单的例子,还有很多的用处有待于以后使用中的慢慢发觉。






Ps:他这方法应该说是很通用的,我在linux下也顺利编译了下,发现编译后的文件比源文件大很多,而不像class那样和java文件大小差不多。而且,cat *.class也可以看到一些源代码的变量声明啥的,总之觉得编译成class文件是比较简单的。我的探索如下:

shenscu@debian-linux:~/tcp/JavaIM111$ ls
ClientThread.java JavaIM.java ServerThread.java
shenscu@debian-linux:~/tcp/JavaIM111$ gcj -c JavaIM.jar
gcj: JavaIM.jar:没有该文件或目录
gcj: 没有输入文件
shenscu@debian-linux:~/tcp/JavaIM111$ gcj -c JavaIM.java
shenscu@debian-linux:~/tcp/JavaIM111$ ls
ClientThread.java JavaIM.java JavaIM.o ServerThread.java
shenscu@debian-linux:~/tcp/JavaIM111$ gcj -c *.java
shenscu@debian-linux:~/tcp/JavaIM111$ ls
ClientThread.java JavaIM.java ServerThread.java
ClientThread.o JavaIM.o ServerThread.o
shenscu@debian-linux:~/tcp/JavaIM111$ gcj -o JavaIM *.o
/usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld 返回 1
shenscu@debian-linux:~/tcp/JavaIM111$ gcj --main=JavaIM -o JavaIM *.o
shenscu@debian-linux:~/tcp/JavaIM111$ ls
ClientThread.java JavaIM JavaIM.o ServerThread.o
ClientThread.o JavaIM.java ServerThread.java
shenscu@debian-linux:~/tcp/JavaIM111$ ./JavaIM
Input you nickname:


shenscu@debian-linux:~/tcp/JavaIM111$ emacs JavaIM
shenscu@debian-linux:~/tcp/JavaIM111$ javac *.java
shenscu@debian-linux:~/tcp/JavaIM111$ ls
ClientThread.class JavaIM JavaIM.o ServerThread.o
ClientThread.java JavaIM.class ServerThread.class
ClientThread.o JavaIM.java ServerThread.java
shenscu@debian-linux:~/tcp/JavaIM111$ ls -l
总用量 92
-rw-r--r-- 1 shenscu shenscu 1673 2008-10-11 12:45 ClientThread.class
-rw-r--r-- 1 shenscu shenscu 899 2008-10-11 12:10 ClientThread.java
-rw-r--r-- 1 shenscu shenscu 10220 2008-10-11 12:43 ClientThread.o
-rwxr-xr-x 1 shenscu shenscu 32960 2008-10-11 12:44 JavaIM
-rw-r--r-- 1 shenscu shenscu 601 2008-10-11 12:45 JavaIM.class
-rw-r--r-- 1 shenscu shenscu 630 2008-10-11 12:10 JavaIM.java
-rw-r--r-- 1 shenscu shenscu 6724 2008-10-11 12:43 JavaIM.o
-rw-r--r-- 1 shenscu shenscu 1083 2008-10-11 12:45 ServerThread.class
-rw-r--r-- 1 shenscu shenscu 575 2008-10-11 12:10 ServerThread.java
-rw-r--r-- 1 shenscu shenscu 8628 2008-10-11 12:43 ServerThread.o
shenscu@debian-linux:~/tcp/JavaIM111$ jar *.class
jar: invalid option -- l
Try `jar --help' for more information.
shenscu@debian-linux:~/tcp/JavaIM111$ jar *.class -o 11
jar: invalid option -- l
Try `jar --help' for more information.
shenscu@debian-linux:~/tcp/JavaIM111$ jar -o 11 *.class
jar: invalid option -- o
Try `jar --help' for more information.
shenscu@debian-linux:~/tcp/JavaIM111$ jar -c 11 *.class
PK
�eK9 META-INF/PK
�eK9F�2((META-INF/MANIFEST.MFManifest-Version: 1.0
Created-By: 0.95

11: No such file or directory
Error adding 11 to jar archive!
shenscu@debian-linux:~/tcp/JavaIM111$ clear

shenscu@debian-linux:~/tcp/JavaIM111$ ls
ClientThread.class JavaIM JavaIM.o ServerThread.o
ClientThread.java JavaIM.class ServerThread.class
ClientThread.o JavaIM.java ServerThread.java
shenscu@debian-linux:~/tcp/JavaIM111$ ls -l
总用量 92
-rw-r--r-- 1 shenscu shenscu 1673 2008-10-11 12:45 ClientThread.class
-rw-r--r-- 1 shenscu shenscu 899 2008-10-11 12:10 ClientThread.java
-rw-r--r-- 1 shenscu shenscu 10220 2008-10-11 12:43 ClientThread.o
-rwxr-xr-x 1 shenscu shenscu 32960 2008-10-11 12:44 JavaIM
-rw-r--r-- 1 shenscu shenscu 601 2008-10-11 12:45 JavaIM.class
-rw-r--r-- 1 shenscu shenscu 630 2008-10-11 12:10 JavaIM.java
-rw-r--r-- 1 shenscu shenscu 6724 2008-10-11 12:43 JavaIM.o
-rw-r--r-- 1 shenscu shenscu 1083 2008-10-11 12:45 ServerThread.class
-rw-r--r-- 1 shenscu shenscu 575 2008-10-11 12:10 ServerThread.java
-rw-r--r-- 1 shenscu shenscu 8628 2008-10-11 12:43 ServerThread.o

java二人聊天工具(两个线程)

上次那是单线程的,所以只能发一句,收一句。
改进了下,使用多线程的了。能够收发互不影响。
不过至少有一个缺陷在于:虽然发了信息之后马上就关闭了socket,但立刻一个while循环,开始了新的socket的建立,很是浪费网络啊。。。要改下也不难,在clientThread里面,在cin.readLine()函数之后再建立socket。现在懒得搞了,后面再看吧。
还有些Exception啥的,都没搞懂,就是说程序不是那么的安全,以后慢慢搞。写下代码特此纪念。
一共三个文件:
clientThread.java // 发信息线程。
serverThread.java // 收信息线程。
JavaIM.java // 主程序。
还是没注释……继续汗。。

发现还是有些注释,多半是从别人的代码上修改来的。。。
我这里先运行的clientThread,我觉得serverThread要一直等待着被main()创建,就放后面了。



// File name: JavaIM.java
import java.io.*;
import java.net.*;

public class JavaIM extends ServerSocket {
protected static final int SERVER_PORT = 10000;

public JavaIM() throws IOException {

super(SERVER_PORT);
new ClientThread(); // Create a clientThread to
// connect and send message
// Listening the port 10000
try {
while (true) {

Socket socket = accept(); // Accept a connection
new ServerThread(socket); // Create a serverThread
// To receive messages
}
} finally {
close();
}
}

public static void main(String[] args) throws IOException {
new JavaIM();
}
}









// File name: ClientThread.java
import java.io.*;
import java.net.*;

public class ClientThread extends Thread {

private String sentence;
private String username;

Socket clientSocket;
DataOutputStream outToServer;
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));

public ClientThread() throws IOException {

System.out.println("Input you nickname: ");
while((username = cin.readLine()).length() == 0) {
System.out.println("Empty, please input a valid nickname: ");
}

start();
}

public void run() {

while (true) {

try {
clientSocket = new Socket("192.168.0.100",10000);
outToServer = new DataOutputStream(clientSocket.getOutputStream());
sentence = cin.readLine();
outToServer.writeBytes("<" + username + ">" + sentence + "\n");
clientSocket.close();
} catch(UnknownHostException u) { }
catch(IOException e) { }
}
}
}








// File name: ServerThread.java
import java.io.*;
import java.net.*;

//--- ServerThread
class ServerThread extends Thread {

private Socket client;
private BufferedReader in;
private String sentence;

public ServerThread(Socket s) throws IOException {

client = s;
in = new BufferedReader(new InputStreamReader(client.getInputStream()));

start();
}

public void run() {
try {
sentence = in.readLine();
System.out.println(sentence);
client.close();
} catch (IOException e) {
}
finally {
try {
client.close();
} catch (IOException e) {
}
}
}
}

2008年10月9日星期四

java二人聊天工具。

把老师的代码拿来改了下,写了个程序。
一个TCPClient,一个TCPServer,简单的二人聊天。
难怪最多只能得六分(十分制),果然是很简单的。
没有写注释了,汗。。。
备忘,以后有空再说。。


/*
* File:TCPClient.java
*
*/
import java.io.*;
import java.net.*;

public class TCPClient {
public static void main(String arg[]) throws Exception{

String clientSentence;
String serverSentence;

Socket clientSocket = new Socket("192.168.0.100",1234);;


BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(System.in));
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

while(true) {

clientSentence = inFromClient.readLine();
outToServer.writeBytes(clientSentence + '\n');

serverSentence = inFromServer.readLine();
System.out.println("FROM SERVER:" + serverSentence);
}
}
}









/*
*
* File: TCPServer.java
*
*/


import java.io.*;
import java.net.*;

public class TCPServer {
public static void main(String arg[]) throws Exception {

String clientSentence;
String serverSentence;

ServerSocket welcomeSocket = new ServerSocket(1234);
Socket connectionSocket = welcomeSocket.accept();

BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(System.in));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());

while(true) {

clientSentence = inFromClient.readLine();
System.out.println("From Client: " + clientSentence);

serverSentence = inFromServer.readLine();
outToClient.writeBytes(serverSentence + '\n');
}
}
}

2008年10月6日星期一

ubuntu安装备忘(2)

简洁点了:
语言:english(默认)。
键盘:us(默认)
地区:(chongqing)china。
分区:
/dev/sda1 20G ext3 /
/dev/sda2 10G ext3
/dev/sda3 10G ext3
/dev/sda5 1G swap
/dev/sda6 10G ext3 /usr/local
/dev/sda7 8G ext3 /dump
/dev/sda8 60G ext3 /home
剩下好像还有40G,留着看吧。
sda2,sda3安装其他系统用的,也留着。
户口:(略)
安装:(disable网络,其余略)
重启。
安装系统至此结束。


剩下的工作:
1. 配置文件备份:
mkdir /dump/shencu
sudo cp ~/.bash* ~/.profile /dump/shenscu
2. 更改源source.lst: 系统->系统管理->软件源。
没测试cn官方源,不知速度如何。rootguide更新速度似乎有点慢,lupaworld曾被打击过(似乎有点道理),shlug下载速度更是慢得可怜(貌似网通的?)。以前一直用nchc的源,debian上也几乎没用大陆的cn99,现在不知为什么nchc的速度很慢很慢了。最终选择了tw官方源,速度也挺不错的,大概110K/S。顺便勾上了:统计->提交统计信息。
3. 安装更新: 系统->系统管理->更新管理器。
4. 安装受限硬件驱动: 系统->系统管理->受限硬件驱动。
安装好后,由于重启后分辨率会变得 特别低,就在应用程序->其他显示器和显卡,上面选择了通用lcd 1024X768的显示器。
5. sudo apt-get install build-essential
sudo apt-get install gcj
# sudo apt-get install emacs
# sudo apt-get install vim-gnome
# sudo apt-get install devhelp
后面三个其实不是命令行安装的,应用程序->添加删除:安装emacs gvim和devhelp。
6. 语言支持:选好中文,默认英文。
然后 sudo apt-get remove scim
sudo apt-get autoremove
接着在软件包管理上面删除残余的配置文件。
最后 sudo apt-get install fcitx。
7. 添加删除文件:安装OpenOffice.Org套件。
8. 删除~目录下的所有文件:
sudo umount .gvfs
rm * .* -r
提示. ..不能删除。
然后将以前备份的文件/dump/shenscu/*给复制到~下面。
9. 重启,进入系统时选择中文登录界面。
10.其他的东西,详情见:
ubuntu安装备忘(n)(n >= 3)。

ubuntu安装备忘(1)

前天晚上准备删掉windows重新来过的。于是把ubuntu安装iso文件,以及debian网络安装引导文件以及其他一些以后很可能用到的文件放到u盘上。然后建立了一个menu.lst文件,将其及iso文件放到根目录下。menu.lst内容如下:
title Debian Netboot Stable
root (fd0)
kernel /boot/netboot/etch/linux
initrd /boot/netboot/etch/initrd.gz

title Install Ubuntu 8.04
root (fd0)
kernel /boot/ubuntu804/vmlinuz boot=casper iso-scan/filename=/ubuntu-8.04.1-desktop-i386.iso
initrd /boot/ubuntu804/initrd.gz

通过一张深山红叶工具盘进入grub,输入:
configfile /menu.lst
然后选择第二个进入Ubuntu Live-cd。
打开命令行:

sudo fdisk /dev/sda
o # 创建空的分区表,即清空电脑硬盘上的所有数据!!!
w # 将内容写入硬盘。

不知啥原因总觉得没搞好,又照这命令输了一遍。结果……
居然把u盘上的内容也给删掉了!!!
悲剧……

该怎么办呢?本想到室友那下载个光盘文件,无奈文件太大700M呢,不好意思去。。。又想过下载个debian的网络安装引导文件linux和initrd.gz总共才6M,他们不会那么介意的。。。但打扰别人毕竟不好。。
想到这有张ubuntu6.06的光盘,于是进入live-cd。当时十一点了,只有一个小时的时间,而我们这网速要下700M得100分钟才行。于是下载了etch的netboot文件,格式化u盘,放到u盘上。

第二天……,使用u盘安装debian基本系统。结果我自作聪明,内核参数加了个priority=low,于是进入专家模式安装,却又出现意外,安装好后,进入系统才发现居然没有sudo这个命令,也许是内核装的版本太新了吧。重启single模式,wget下载ubuntu iso文件。挂载iso,提取出casper下面的initrd.gz和vmlinuz文件,按照前面的方法进入系统。

您的博客已被锁定?!ubuntu备忘(后面再写)。

郁闷。居然说我这博客可能是垃圾博客,郁闷了。
刚刚忙完ubuntu的安装,正准备在这留个纪念呢,却遇到这档子事。
哎!想不到哪有问题,管它呢。好心情可别让google给搅和了。
貌似还可以写日志。
先写了再说。

2008年10月5日星期日

去?留?

前几天又有格式化硬盘的冲动了,而且还持续到现在。搞得现在头晕脑胀的,不知是去是留。
想删掉windows吧,上面还有泡泡堂,还有四国军棋。不删吧,一开计算机,习惯性的进入windows,习惯性的打开QQ,习惯性的玩起了游戏……时间就这样一分一秒的给溜掉了,怎么都抓不住。
可悲的是,昨天刚刚加了一个玩了很久的泡泡堂好友的QQ。要是没这档子事,去的机会又要大些了。删掉了又能怎么样呢?说不定第一件事就是装个虚拟机,然后搞个windows,要不就尝试能不能成功的把泡泡堂给wine了。
去否?留否?
windows,linux,泡泡堂,好友……
如何决策呢?这倒真是个喜剧的问题。以前想这问题的时候,首要考虑的是QQ,现在呢?Tencent已经支持linux了,这个以前认为瓶颈的问题就这样给解决了。看来现在最主要的问题就是windows下的游戏(特指泡泡堂,四国军棋)有没有再玩下去的必要了,同来的问题就是与很久的好友失去联系,尤其是都很久很久了(不记得那么具体)还能一起玩游戏的朋友。失去他们就像失去XX一样,总感觉割舍不下啊。
想当年……,想个P啊。今年五月份的时候一气之下就把QQ空间里面的东西全给删了,虽然没啥重要的文件,不过总归是一个时期的记录啊,多少能看出点什么,也多少能从中体会出什么的。
可悲……那就学学五月份的时候吧!下定决心,虽不一定很理智,但就这样了罢!
删!!!
别了,泡泡堂!别了,朋友!