>>> Let's run Python on Mobile

วันพฤหัสบดี, มกราคม 25, 2550

How to Swing on UIQ

You can't run normal Swing application on UIQ.
(Swing is Java2SE(or more),but PersonalJava on UIQ is Java 1.1)
But you can make your own Swing app. that can run on UIQ.
Here is how to do that...

Once upon the time,when Java was version 1.1,there was a Swing Package named "swingall.jar".
File named swingall.jar,was prepared for compiling and running Swing app. on Java1.1.
Try Google-searching for swingall.jar.
Swingall.jar has many versions,the version you need is version that has folder "javax" insided.

To compile Swing app. for UIQ,You have to use JDK1.1.8,that can D/L here
http://java.sun.com/products/archive/jdk/1.1.8_006/index.html
After JDK1.1.8 installation(in C:\JDK1.1.8),place swingall.jar in C:\(current folder),and use this command to compile.
(My example sourcecode is C:\Stest.java)

path .;C:\jdk1.1.8\bin
javac -classpath ".;C:\swingall.jar;C:\JDK1.1.8\lib\classes.zip" Stest.java

Then you have file Stest.class in C:\ on your PC.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Stest extends JButton implements ActionListener {
Stest() {
super("Exit");
addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
public static void main(String args[]) {
JFrame MyFrame = new JFrame("Hello!!");
Container MyCont = MyFrame.getContentPane();
MyCont.setLayout(new FlowLayout());
Stest TheButton = new Stest();
MyCont.add(TheButton);
MyFrame.setSize(170,100);
MyFrame.setVisible(true);
TheButton.requestFocus();
}
}


How to run Swing app. on UIQ.
Just place swingall.jar in C:\classes (on UIQ),and add classpath(-cp) to C:\classes\swingall.jar

Or you can run it with jRun in jCompile program.
http://www.freepoc.org/viewapp.php?id=42
After install jrunp800.sis,change content of jRun.txt into...
-cp C:\classes\swingall.jar;C:\classes Stest

Place swingall.jar and Stest.class in C:\classes on UIQ.
Activate jRun,you will run your Swing app. on your UIQ like this.



Stest.zip

วันอังคาร, มกราคม 23, 2550

Jython Examples


Jython on UIQ


Jython on UIQ

jython08.py

import os
import java.lang
from java.awt import Frame,MenuBar,Menu,MenuItem,TextArea,FileDialog
from java.awt.event import ActionEvent
class jython08(java.awt.Frame):
def __init__(self):
self.size=(208,276)
self.myOutput=java.awt.TextArea("Hello UIQ from Jython!!!")
self.add("Center",self.myOutput)
self.myMenuBar=java.awt.MenuBar()
self.myMenu=java.awt.Menu("Menu")
self.myReadFile=java.awt.MenuItem("Read File",actionPerformed=self.doRead)
self.myMenuExit=java.awt.MenuItem("Exit",actionPerformed=self.doExit)
self.myMenuBar.add(self.myMenu)
self.myMenu.add(self.myReadFile)
self.myMenu.add(self.myMenuExit)
self.setMenuBar(self.myMenuBar)
self.setVisible(1)
def doRead(self,event):
d=java.awt.FileDialog(self,"Select File",java.awt.FileDialog.LOAD)
d.setDirectory("D:\\")
d.setVisible(1)
myFile = open(d.getDirectory()+d.getFile(),'r')
myText = myFile.read()
self.myOutput.setText(myText)
myFile.close()
def doExit(self,event):
java.lang.System.exit(0)
if __name__=="__main__":
myApp=jython08()


Jython on UIQ

jython07.py

import os
import java.lang
from java.awt import Frame,Button,TextArea
from java.awt.event import ActionEvent
class jython07(java.awt.Frame):
def __init__(self):
self.size=(208,276)
myFile = open("D:\\jython\\jython07.py",'r')
myText = myFile.read()
myFile.close()
self.myOutput=java.awt.TextArea(myText)
self.theButton=java.awt.Button("Exit",actionPerformed=self.doExit)
self.add("Center",self.myOutput)
self.add("South",self.theButton)
self.setVisible(1)
def doExit(self,event):
java.lang.System.exit(0)
if __name__=="__main__":
myApp=jython07()


Jython on UIQ

วันจันทร์, มกราคม 22, 2550

jython06.py

import java.lang
from java.awt import Frame,MenuBar,Menu,MenuItem,TextArea
from java.awt.event import ActionEvent
class jython06(java.awt.Frame):
def __init__(self):
self.size=(208,276)
self.myOutput=java.awt.TextArea("Hello UIQ from Jython!!!\n")
self.add("Center",self.myOutput)
self.myMenuBar=java.awt.MenuBar()
self.myMenu=java.awt.Menu("Menu")
self.one=java.awt.MenuItem("Say Hello",actionPerformed=self.sayHello)
self.two=java.awt.MenuItem("Say Hi",actionPerformed=self.sayHi)
self.myMenuExit=java.awt.MenuItem("Exit",actionPerformed=self.doExit)
self.myMenuBar.add(self.myMenu)
self.myMenu.add(self.one)
self.myMenu.add(self.two)
self.myMenu.add(self.myMenuExit)
self.setMenuBar(self.myMenuBar)
self.setVisible(1)
def sayHello(self,event):
self.addSomething("Hello\n")
def sayHi(self,event):
self.setOutput("hi\n")
def addSomething(self,tx):
self.myOutput.appendText(tx)
def setOutput(self,tx):
self.myOutput.setText(tx)
def doExit(self,event):
java.lang.System.exit(0)
if __name__=="__main__":
myApp=jython06()


Jython on PC


Jython on UIQ

jython05.py

import java.lang
from java.awt import Frame,MenuBar,Menu,MenuItem,TextArea
from java.awt.event import ActionEvent
class jython05(java.awt.Frame):
def __init__(self):
self.size=(208,276)
self.myOutput=java.awt.TextArea("Hello UIQ from Jython!!!")
self.add("Center",self.myOutput)
self.myMenuBar=java.awt.MenuBar()
self.myMenu=java.awt.Menu("Menu")
self.myMenuExit=java.awt.MenuItem("Exit",actionPerformed=self.doExit)
self.myMenuBar.add(self.myMenu)
self.myMenu.add(self.myMenuExit)
self.setMenuBar(self.myMenuBar)
self.setVisible(1)
def doExit(self,event):
java.lang.System.exit(0)
if __name__=="__main__":
myApp=jython05()


Jython on PC


Jython on UIQ

jython04.py

import java.lang
from java.awt import Frame,Button,TextArea
from java.awt.event import ActionEvent
class jython04(java.awt.Frame):
def __init__(self):
self.size=(208,276)
self.myOutput=java.awt.TextArea("Hello UIQ from Jython!!!")
self.theButton=java.awt.Button("Exit",actionPerformed=self.doExit)
self.add("Center",self.myOutput)
self.add("South",self.theButton)
self.setVisible(1)
def doExit(self,event):
java.lang.System.exit(0)
if __name__=="__main__":
myApp=jython04()


Jython on PC


Jython on UIQ

jython03.py

import java.lang
from java.awt import Frame,Label,Button,GridLayout
from java.awt.event import ActionEvent
class jython03(java.awt.Frame):
def __init__(self):
self.size=(208,276)
self.theLabel=java.awt.Label("Hello",java.awt.Label.CENTER)
self.aButton=java.awt.Button("Exit A",actionPerformed=self.doExit)
self.bButton=java.awt.Button("Exit B",actionPerformed=self.doExit)
self.cButton=java.awt.Button("Exit C",actionPerformed=self.doExit)
self.setLayout(java.awt.GridLayout(4,1))
self.add(self.theLabel)
self.add(self.aButton)
self.add(self.bButton)
self.add(self.cButton)
self.setVisible(1)
def doExit(self,event):
java.lang.System.exit(0)
if __name__=="__main__":
a=jython03()


Jython on PC


Jython on UIQ

jython02.py

import java.lang
from java.awt import Frame,Label,Button,BorderLayout
from java.awt.event import ActionEvent
class jython02(java.awt.Frame):
def __init__(self):
self.size=(208,276)
self.theLabel=java.awt.Label("Hello",java.awt.Label.CENTER)
self.nButton=java.awt.Button("North Exit",actionPerformed=self.doExit)
self.eButton=java.awt.Button("East Exit",actionPerformed=self.doExit)
self.wButton=java.awt.Button("West Exit",actionPerformed=self.doExit)
self.sButton=java.awt.Button("South Exit",actionPerformed=self.doExit)
self.setLayout(java.awt.BorderLayout())
self.add("Center",self.theLabel)
self.add("North",self.nButton)
self.add("East",self.eButton)
self.add("West",self.wButton)
self.add("South",self.sButton)
self.setVisible(1)
def doExit(self,event):
java.lang.System.exit(0)
if __name__=="__main__":
a=jython02()


Jython on PC


Jython on UIQ

jython01.py

import java.lang
from java.awt import Frame,Label,Button
from java.awt.event import ActionEvent
class jython01(java.awt.Frame):
def __init__(self):
self.size=(208,276)
self.theLabel=java.awt.Label("Hello",java.awt.Label.CENTER)
self.theButton=java.awt.Button("Exit",actionPerformed=self.doExit)
self.add("Center",self.theLabel)
self.add("South",self.theButton)
self.setVisible(1)
def doExit(self,event):
java.lang.System.exit(0)
if __name__=="__main__":
a=jython01()


Jython on PC


Jython on UIQ

วันศุกร์, มกราคม 19, 2550

Simplify Symbian programming

ว่าจะหัดเขียน โปรแกรมสำหรับ UIQ ด้วย C++ ดูบ้าง
เผื่อจะใช้ C++ ได้คล่องขึ้น และที่สำคัญ มันจำเป็นสำหรับการเขียน JNI
แล้วต้องเตรียมอะไรบ้าง
ตามตำราเขาว่า มี UIQ,PC และก็ลง Symbian SDK for UIQ ซึ่งมีแถมมากับหนังสือ หรือจะ D/L ได้ที่นี่
http://developer.sonyericsson.com
ต่อมา เขาว่าต้องมี C++ compiler เช่น MS visual studios หรือ Code Warrior
ยุ่งยากจัง ใช้ Editor ตัวอื่น แล้วคอมไพล์ผ่าน Command Line ได้หรือเปล่า
แล้วใน Symbian SDK มันมี GNU C Compiler แนบมาแล้วนี่ แล้วใช้แค่นี้ได้หรือเปล่า
อ่านๆดูเขาว่าต้องใช้คอมไพล์โปรแกรม สำหรับ Emulator
ถ้าผมไม่อยากลง compiler เพิ่มก็ คอมไพล์โปรแกรม สำหรับ Emulator ไม่ได้
ไม่ได้ก็ไม่ได้สิ เขียนลง SmartPhone อย่างเดียวก็แล้วกัน (แค่หัดเขียนเองนี่นา)
ว่าแล้วก็ข้ามขั้นตอนนี้ไปเลย

ในSymbian SDK for UIQ จะมี Perl แนบมาด้วย ต้องลง Perl อีก
เครื่องผมมี Perl เวอร์ชันล่าสุด อยู่แล้ว ข้ามไปเลย

ในSymbian SDK มีJava1.3 เขาให้ลงเพิ่มด้วย
มันจำเป็นสำหรับ tools หลายๆอย่าง เช่น AIFbuilder
ผมมี Java1.6,Java1.1.8อยู่แล้ว จะให้ลง Java1.3อีกเหรอ
ว่าแล้ว ก็ข้ามไปอีกขั้น (มารู้ทีหลังว่าข้ามขั้นนี้ ไม่ดี มันยุ่งกว่าที่คิด)

เสร็จเรียบร้อยก็ลองคอมไพล์ HelloWorld (อยู่ในโฟลเดอร์ UIQExamples)
ลองcopyมาที Desktop แล้วเปิด Command Prompt
devices -setdefault @UIQ_21:com.symbian.UIQ

CD ไปที่โฟลเดอร์ HelloWorld แล้วสั่ง
bldmake bldfiles
abld build armi urel

ผลออกมา error คอมไพล์ไม่ผ่าน
ค้นๆดูเขาว่า สงสัยเป็นที่ path มี space อยู่ เช่น "Documents and Settings"
เลยลองคอมไพล์ ที่โฟลเดอร์ HelloWorld ที่อยู่ใน C:\symbian
คราวนี้ผ่าน :)
ลองsearchดู มีไฟล์ชื่อ HelloWolrd หลายนามสกุลกระจายอยู่หลายโฟลเดอร์

ต่อมาเขาให้ลองใน Emulator ผมข้ามไปเลยแล้วกัน
ขั้นต่อไป ใช้ AIFbuilder
ไม่มี java1.3 ให้ มันเลยไม่ยอมเรียก AIFbuilder ขึ้นมา
ไม่เป็นไร ใช้ CommandLine ก็ได้

อ่านๆดูถ้าจะใช้ CommandLine มีอีกหลายขั้น
bmconv,AIF,aiftool,makesis
ทำไมยุ่งยากจัง มีแค่ Helloworld.app กับ HelloWorld.rsc
โปรแกรมง่ายๆ ก็น่าจะrunได้แล้วนี่

ผมลองนำ Helloworld.app กับ HelloWorld.rsc
ไปใส่ในโฟล์เดอร์ ที่สร้างขึ้นมาใหม่
D:\system\apps\HelloWorld
แล้วลองดูในหน้าหลักของUIQ
มีไอคอน HelloWorld เพิ่มขึ้นมาจริงๆด้วย
ลองคลิกดู ใช้ได้แฮะ :)

วันพฤหัสบดี, มกราคม 11, 2550

วิธีใช้โปรแกรม jRun

โปรแกรม jRun อยู่ในpackageของโปรแกรม jCompile
http://www.freepoc.org/viewapp.php?id=42
โปรแกรม jRun ใช้เรียกโปรแกรมที่เขียนด้วย Java ขึ้นมาทำงาน
โปรแกรม Java อาจอยู่ในรูปของไฟล์ .class
หรือไฟล์ .jar ซึ่งเป็นการรวมหลายๆไฟล์ .class ไว้เป็นไฟล์เดียว (ลองเปิดดูได้ด้วย WinZip หรือWinRar)

ไฟล์ jRunP800.SIS ที่อยู่ในpackageของโปรแกรม jCompile
คุณอาจติดตั้งไว้ที่ C:\ หรือ D:\ ใน SmartPhone UIQ
เมื่อติดตั้งแล้ว จะมีไฟล์ชื่อ jRun.txt
อยู่ที่ C:(หรือ D:)\system\apps\jRun
ไฟล์ jRun.txt นี้จะต้องบอก classpath และ ไฟล์Javaที่เราจะเรียกให้มันทำงาน
ถ้าคุณเคยใช้โปรแกรมJava โดยเรียกจาก command prompt บน PC ก็คงจะคุ้นเคยกับ classpath และการเรียกโปรแกรม Java มาบ้าง
เช่น
ถ้ามี ไฟล์ HelloUIQ.class อยู่ที่ C:\classes ใน Smartphone
ก็ set ไฟล์ jRun.txt เป็น
-cp C:\classes HelloUIQ
โดยคำแรกจะเป็น -cp กั้นด้วยspace ตามด้วยClasspath
แล้วกั้นด้วยspaceอีกครั้ง แล้วตามด้วยชื่อไฟล์ ที่จะrun (แค่ชื่อ ไม่มี.class)

ตัวอย่างถัดไป
-cp C:\classes;C:\REGEX myreg
เป็นการเรียกไฟล์ myreg.class
โดยไฟล์ที่ต้องการเรียกใช้ร่วมกับ myreg.class อยู่ใน C:\classes หรือ C:\REGEX

อีกตัวอย่าง
-cp C:\classes\myjar.jar hello
เป็นการเรียกไฟล์ hello.class
โดยไฟล์ hello.class และไฟล์ที่ต้องการเรียกใช้ร่วมกับ hello.class อยู่ใน C:\classes\myjar.jar

วันจันทร์, มกราคม 01, 2550

Touch of Reflection in Java

หลังจากพยายามอ่านเรื่องReflection in Javaจนเวียนศีรษะไปหลายรอบ
ด้วยคำชี้แนะจากคุณsiros แห่ง Narisa.com (ขอขอบคุณมา ณ ที่นี้)
ผมก็เขียนโปรแกรมเสร็จอีก 2 โปรแกรม
โปรแกรมนึงไว้เลือก Exec ไฟล์จาวา .class ใน UIQ
(runตัวนี้ด้วย JRun จะrunไฟล์จาวาตัวอื่นๆต่อก็สะดวกขึ้นเยอะเลย)
อีกโปรแกรมไว้ Reflection ดูวิธีใช้แต่ละคำสั่ง
(ไม่ต้องพกคู่มือหนาๆไว้ในรถแล้วละที่นี้)

ไว้วันถัดไปจะมาแนะนำวิธีใช้ JRun เปิดrunไฟล์จาวา .class ใน UIQ