Sun ONE studio 5, Mobile Edition là một phiên bản được thay đổi từ Sun ONE Studio để hỗ trợ và giúp đỡ các lập trình viên trong việc phát triển các ứng dụng MIDP. Nó kết hợp các khả năng của Wireless Toolket với Sun ONE Studio tạo thành một môi trường với các chức năng sau :
Kết hợp việc biên dịch, tiền kiểm tra, thực thi MIDlet và MIDlet suite.
Tựđộng phát sinh tập tin JAD và JAR.
Tích hợp khả năng gỡ rối (debug) cho MIDlet.
Code completion
Có thể tích hợp với các trình giả lập hay các bộ JDK của hãng thứ ba nhờ
vào Unified Emulator Interface
Cung cấp các mẫu cho việc tạo ra các MIDlet và MIDlet suite.
Tích hợp sẵn một trình giả lập
Có thể thiết lập trình giả lập riêng cho mỗi dự án J2ME.
Công cụ AutoUpdate giúp tựđộng hóa việc cập nhật công cụ.
Quản lý project :
Một project được tạo bởi Sun ONE Studio khi mới được tạo sẽ là một project rỗng. Chúng ta phải tự thêm vào các MIDlet hay MIDlet suite theo nhu cầu của mình.
Hình 1-5 : Tạo project J2ME bằng Sun ONE Studio 5
Wizard tạo ra các tập tin dựa trên mẫu mà chúng ta chọn, các mẫu sau đây
được hỗ trợ trong công cụ :
Class : một lớp Java rỗng.
HelloMIDlet : một lớp có khả năng hiển thị văn bản lên màn hình thiết bị.
MIDPCanvas : tạo ra một lóp con của lớp Canvas. Canvas cho chúng ta
khả năng thao tác đồ họa cấp thấp.
MIDlet : các lóp thực thi cơ bản cho một thiết bị không dây.
MIDlet Suite : tạo ra một MIDlet suite.
Sau khi chọn mẫu, wizard sẽ lấy các thông tin cần thiết. Sau giai đoạn này, các tập tin sẽđược tạo ra.
Tab Project trên màn hình Explorer cung cấp cho chúng ta một cái nhìn bên
trong project. Từ đây, chúng ta có thể duyệt qua các thông tin chứa đựng trong MIDlet.
Cửa sổ quản lý dự án.
Các thư viện khác có thể được tích hợp vào trong công cụ bằng tab
Filesystems trên cửa sổ Explorer.
Editor :
Màn hình soạn thảo mã nguồn
Các đặc điểm chính của màn hình soạn thảo mã nguồn :
Tô màu các từ khóa trong ngôn ngữ Java.
Đánh số dòng.
Xem nhiều tập tin trong cùng một cửa sổ.
Định dạng mã nguồn tựđộng
Code completion.
Biên dịch và đóng gói :
Sun ONE Studio cung cấp trợ giúp trong việc biên dịch và đóng gói một dự
án. Với công cụ này chúng ta có thể kết hợp việc tạo ra đóng gói trong khi thực hiện biên dịch. Khi biên dịch, Sun ONE Studio :
Dịch MIDlet và tạo ra các tập tin .class.
Thực hiện tiền kiểm tra các lớp đã được biên dịch.
Tạo tập tin JAD.
Trình giả lập :
Mặc định khi cài đặt, Sun ONE Studio dùng trình giả lập của WTK để chạy các ứng dụng MIDP, ngoài ra, chúng ta cũng có thể thêm vào các trình giả lập khác do hãng thứ ba phát triển bằng chức năng Device Emulator Registry.
Chỉ các trình giả lập có hỗ trợ môi trường giả lập J2ME SDK mới có thể
được dùng chung với Sun ONE Studio. Nghĩa là chúng ta có thể dùng chung công
cụ này với Nokia Developer’s Suite hay Siemens Mobility Toolkit mà không gây
ảnh hưởng gì đến đề án.
Tab Runtime trong cửa sổ Explorer được dùng để quản lý Device Emulator Registry. Qua chức năng này, chúng ta có thể thêm, xóa hay chọn trình giả lập mặc
định để sử dụng.
Bộ gỡ rối (Debugger) :
Sun ONE Studio cung cấp một trình gỡ rối có thể dùng để dò tìm các lỗi trong ứng dụng MIDP. Khi một phiên gỡ rối được bắt đầu, màn hình bao gồm ba cửa sổ là : Debugger Window, Output Window và Source Editor sẽ xuất hiện.
Màn hình Debugger chứa 7 màn hình con, giúp chúng ta xem xét những gì
đang diễn ra trong ứng dụng MIDP của chúng ta, đó là các màn hình :
Session : liệt kê các ứng dụng đang chạy.
Breakpoints : liệt kê các breakpoint được thiết lập. Breakpoint có thể được thiết lập trên một dòng lệnh, trên tên phương thức, trên một ngoại lệ, lớp, luồng hay một biến.
Thread : liệt kê các luồng và nhóm luồng đang chạy trong phiên làm việc hiện hành.
Call Stack : liệt kê sơ đồ các lời gọi hàm được thực hiện trong quá trình thực thi luồng hiện hành. Phương thức được thực thi cuối cùng sẽở đầu danh sách. Phương thức được thực thi đầu tiên sẽ nằm ở cuối danh sách.
Watches : danh sách các biến và biểu thức mà chúng ta cần khảo sát giá trị trong quá trình gỡ rối. Ở đây chúng ta có thể thay đổi giá trị các biến khi chúng
đang chạy.
Variable : liệt kê các biến cục bộ, các thực thể và các biến tĩnh trong phạm vi của phương thức mà chúng ta đang xem xét.
Màn hình gỡ rối của Sun ONE Studio
Nhận xét :
Sun ONE Studio là một trong những chương trình phát triển miễn phí đầu tiên cho J2ME. Hầu như tất cả các đặc tính mà một lập trình viên mong đợi đều
được tích hợp vào trong công cụ này. Một lập trình viên có hiểu biết vể MIDP và đã có kinh nghiệm trong việc sử dụng Sun ONE Studio có thể dùng nó để phát triển
ứng dụng MIDP chỉ sau một vài giờ tìm hiểu.
Tuy nhiên, Sun ONE Studio lại thiếu các đặc điểm khác khi lập trình J2ME
để có thể giúp nó nổi trội hơn các trình soạn thảo đối thủ khác. Hầu hết các đặc
điểm có được là do được đem từ phiên bản dành cho J2SE sang.
Sun ONE Studio là một phiên bản miễn phí. Do đó một số chức năng của nó vẫn chưa thực sự tốt so với các công cụ thương mại khác.
Chương 2 : GIỚI THIỆU KHÁI QUÁT VỀ CHUẨN J2ME
2.1. Nền tảng Java :
Khi Sun Microsystems nhận ra rằng việc tạo ra một nền tảng chung để
chạy trên tất cả các môi trường là điều không thể thực hiện được, công ty đã quyết
định chia công nghệ Java của mình thành 3 phiên bản, mỗi phiên bản được ứng dụng trong một lĩnh vực riêng biệt, các phiên bản đó là :
Java 2 Platform, Enterprise Edition (J2EE™) phục vụ cho các nhu cầu về
thương mại như phục vụ khác hàng, các vấn đề về phân phối, các vấn đề về nhân sự. Phiên bản này được chạy trên các máy server.
Java 2 Platform, Standard Edition (J2SE™) được cung cấp cho thị trường máy tính để bàn trong các máy tính phục vụ văn phòng hay trong gia đình.
Java 2 Platform, Micro Edition (J2ME™) chạy trên các máy với tài
nguyên hạn chế.
Hình vẽ sau minh họa các phiên bản hiện có của Java và lĩnh vực ứng dụng của chúng, bắt đầu từ bên trái là các nền tảng cao cấp sang bên phải là các nền tảng cấp thấp hơn. Java 2 Enterprise Edition hỗ trợ các máy tính dùng trong doanh nghiệp, Java 2 Standard Edition hỗ trợ cho các máy tính các nhân, máy tính để bàn. Java 2 Micro Edition được chia thành 2 loại cho các thiết bị cấp cao (máy PDA cấp cao, điện thoại web) và các thiết bị cấp thấp (điện thoại di động và PDA với khoảng 512KB bộ nhớ).
Hình 2-1 : Kiến trúc J2ME
Kiến trúc J2ME được thiết kế để có thể hỗ trợ các thiết bị nhúng khác nhau trên thị trường. Để làm được như thế, môi trường J2ME cung cấp nhiều loại máy ảo Java (Java Virtual Machine) khác nhau.
Với các thiết bị cấp thấp, tài nguyên hạn chế, môi trường J2ME cung cấp một cấu hình máy ảo Java rất nhỏ và các thư viện Java chỉ gồm các gói/lớp cần thiết cho thiết bị. Giống như việc các nhà sản xuất thiết bị phát triển các tính năng khác trong sản phẩm của mình, cấu hình này có thể được mở rộng với các thư viện mới phục vụ cho nhu cầu của thị trường. Để hỗ trợ cho khả năng tùy biến và khả năng mở
rộng này, chúng ta có 3 khái niệm sau trong kiến trúc J2ME.
Configuration (Cấu hình) :
Cấu hình là đặc tả định nghĩa một môi trường phần mềm cho một dòng các thiết bịđược phân loại bởi tập hợp các đặc tính, ví dụ như :
Kiểu và số lượng bộ nhớ
Kiểu và tốc độ bộ vi xử lý
Kiểu mạng kết nối
Một configuration định nghĩa các đặc điểm của máy ảo Java và cung cấp các thư viện lớp tối thiểu mà các nhà sản xuất thiết bị như Samsung, Nokia …bắt buộc phải thực thi đầy đủ để các lập trình viên có thể dựa vào môi trường lập trình nhất
quán và thông qua sự nhất quán này, các ứng dụng được tạo ra có thể mang tính độc lập thiết bị cao nhất có thể.
Profile :
Profile mở rộng configuration bằng cách thêm vào các class để bổ trợ các tính năng cho từng thiết bị chuyên biệt. Mỗi profile định nghĩa một tập hợp các class khác nhau, nên thường ta không thể chuyển một ứng dụng Java viết cho một profile này và chạy trên một máy hỗ trợ một profile khác. Cũng với lý do đó, chúng ta không thể lấy một ứng dụng viết trên J2SE hay J2EE và chạy trên các máy hỗ trợ
J2ME. Một thiết bị có thể hỗ trợ nhiều profile.
Optional package :
Là các API có thể sử dụng trong nhiều thiết bị hay một họ các thiết bị. Một
J2ME option package là một tập các API nằm trên một profile. Một optional
package thường chứa các chức năng độc lập với các thiết bị. Mục đích chính của các optional package này là cho phép bổ sung các API trên các profiles. Một thiết bị
có thể hỗ trợ nhiều optional package khác nhau.
Configurations, profiles và các optional packages sử dụng các tính năng của máy ảo Java (Java Virtual Machine). Máy ảo này chạy trên một hệđiều hành thuộc về phần mềm hệ thống của thiết bị. Quan hệ của chúng được thể hiện qua hình vẽ
Hình 2-2 : Các thành phần trong kiến trúc J2ME
Configuration :
Trong môi trường J2ME, một ứng dụng được viết cho một profile riêng biệt nào đó, profile này lại mở rộng từ một configuration. Vì thế, tất cả các đặc điểm của một configuration sẽ được giữ lại trong profile có thể được sử dụng bởi ứng dụng viết cho profile này.
Một configuration định nghĩa một nền Java cho các thiết bị có các đặc tính tương tự nhau (chẳng hạn như về bộ nhớ, tốc độ xử lý,…). Một configuration sẽ xác
định :
• Các tính năng của ngôn ngữ Java được hỗ trợ.
• Các tính năng của máy ảo Java được hỗ trợ.
• Thư viện chuẩn và các API .
Nói một cách đơn giản, một configuration định nghĩa một đặc tả mà các nhà sản xuất thiết bị và những người xây dựng profile phải tuân theo. Tất cả các thiết bị
có chung đặc tính (bộ nhớ, tốc độ xử lý) phải “đồng ý” cài đặt đúng các đặc điểm
được xác định và những người xây dựng profile chỉđược sử dụng các đặc tính được
thoại Samsung thì có thể sửa đổi chương trình của mình một cách tối thiểu nhất để
có thể chạy trên điện thoại Nokia. Qua đây ta thấy khẩu hiệu “Write Once, Run Anywhere” của Java đã không còn đúng nữa, nhưng chúng ta cũng phải đánh giá cao sự nỗ lực của Sun trong việc tạo ra một môi trường phần mềm chung cho vô số
chủng loại thiết bị di động có trên thị trường. Hiện nay Sun đã đưa ra 2 dạng Configuration :
a) CLDC - Connected Limited Device Configuration :
CLDC được thiết kếđể nhắm vào thị trường các thiết bị cấp thấp (low-end), các thiết bị này thông thường là máy nhắn tin, máy điện thoại di động và PDA. Các thiết bị này có giao diện đơn giản, bộ nhớ khoảng 32K đến 512 KB bộ nhớ, băng thông nhỏ, trong các thiết bị này, việc truyền thông trên mạng không dựa vào giao thức TCP/IP. Vì tài nguyên bộ nhớ hạn chế nên CLDC được gắn với Java không dây (Java Wireless ), dạng như cho phép người sử dụng mua và tải về các ứng dụng Java, ví dụ như là Midlet.
b) CDC - Connected Device Configuration :
CDC được đưa ra nhắm đến các thiết bị có tính năng mạnh hơn dòng thiết bị
thuộc CLDC nhưng vẫn yếu hơn các hệ thống máy để bàn sử dụng J2SE. Các thiết bị thuộc loại này bao gồm các hộp điều khiển TV, tivi Internet, điện thoại Internet, các thiết bị giải trí, định hướng. Các thiết bị này có giao diện phong phú, bộ nhớ
nhiều hơn (thông thường là trên 2Mb) và có bộ xử lý mạnh hơn, băng thông lớn và sử dụng giao thức TCP/IP.
Cả 2 dạng cấu hình kể trên đều chứa máy ảo Java (Java Virtual Machine) và tập hợp các lớp (class) Java cơ bản để cung cấp một môi trường cho các ứng dụng J2ME. Tuy nhiên, chú ý rằng đối với các thiết bị cấp thấp, do hạn chế về tài nguyên như bộ nhớ và bộ xử lý nên không thể yêu cầu máy ảo hỗ trợ tất cả các tính năng như với máy ảo của J2SE, ví dụ, các thiết bị thuộc CLDC không có phần cứng hỗ
trợ các phép tính toán dấu phẩy động, nên máy ảo thuộc CLDC không được hỗ trợ
CLDC CDC
RAM 32K….512K ≥ 256K
ROM 128K….512K ≥ 512K
Nguồn năng lượng Có giới hạn (nguồn pin) Không giới hạn
Network Chậm Nhanh
Bảng 2-1 : Phân loại CLDC và CDC
Hình vẽ sau minh họa quan hệ giữa CLDC, CDC và Java 2 Standard Edition (J2SE). Theo đó, chúng ta thấy một phần lớn các chức năng trong CLDC và CDC có được do thừa kế từ Java 2 Standard Edition (J2SE). Mỗi lớp được thừa kế từ
J2SE phải giống hoặc gần giống với lớp tương ứng trong J2SE. Thêm vào đó, CLDC và CDC có một số đặc tính khác được thiết kế cho các thiết bị nhúng mà J2SE không có (ví dụ như các thành phần giao diện).
2.2. Sự khác nhau giữa ngôn ngữ Java trên CLDC với Java thông thường :
Khả năng xử lý số thực :
Các phép toán trên số thực thường cần nhiều thời gian để xử lý. Ngoài ra, phần lớn các thiết bị không có phần cứng hỗ trợ cho việc tính toán trên số thực, do
đó CLDC không hỗ trợ số thực.
Finalization :
Trong các lớp được viết bằng J2SE, chúng ta thường định nghĩa một phương thức có tên là finalize(). Phương thức này sẽ được gọi trước khi bộ thu gom rác (garbage collector) thu gom đối tượng. Phương thức này là nơi chúng ta đặt các mã lệnh để giải phóng các tài nguyên đã sử dụng. Tuy nhiên, CLDC không hỗ trợ
phương thức finalize().
Xử lý lỗi :
Máy ảo Java hỗ trợ rất ít các ngoại lệ xử lý lỗi trong J2SE, lý do của hạn chế
này là :
• Việc xử lý lỗi trong J2SE là khá toàn diện, và đòi hỏi rất nhiều yêu cầu về tài nguyên hệ thống.
• Thông thường, các hệ thống nhúng sẽ cung cấp xử lý lỗi của riêng chúng. Một giải pháp đơn giản cho hầu hết các lỗi nghiêm trọng là thực hiện khởi động lại máy, trong trường hợp này, những lập trình viên không thể xử lý lỗi được vì đã quá trễ.
Các lớp thừa kế từ J2SE :
CLDC yêu cầu khoảng 160 KB để chạy máy ảo Java và các thư viện cơ bản. Do đó, chỉ có một số lớp trong J2SE là được giữ lại trong CLDC :
• Các lớp hệ thống (system classes) java.lang.Class java.lang.Object java.lang.Runnable (interface) java.lang.Runtime java.lang.String
java.lang.StringBuffer java.lang.System java.lang.Thread java.lang.Throwable
• Các lớp thuộc kiểu dữ liệu (Data Type Classes)
java.lang.Boolean java.lang.Byte java.lang.Character java.lang.Integer java.lang.Long java.lang.Short • Collection Classes java.util.Enumeration (interface) java.util.Hashtable java.util.Stack java.util.Vector
• Các lớp nhập/xuất (Input/output Classes)
java.io.ByteArrayInputStream java.io.ByteArrayOutputStream java.io.DataInput (interface) java.io.DataInputStream java.io.DataOutput (interface) java.io.DataOutputStream java.io.InputStream java.io.InputStreamReader java.io.OutputStream java.io.OutputStreamWriter java.io.PrintStream java.io.Reader java.io.Writer
• Calendar and Time Classes
java.util.Calendar java.util.Date java.util.TimeZone • Utility Classes java.lang.Math java.util.Random
• Exception Classes java.io.EOFException java.io.InterruptedIOException java.io.IOException java.io.UnsupportedEncodingException java.io.UTFDataFormatException java.lang.ArithmeticException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayStoreException java.lang.ClassCastException java.lang.ClassNotFoundException java.lang.Exception java.lang.IllegalAccessException java.lang.IllegalArgumentException java.lang.IllegalMonitorStateException java.lang.IllegalThreadStateException java.lang.IndexOutOfBoundsException java.lang.InstantiationException java.lang.InterruptedException java.lang.NegativeArraySizeException java.lang.NullPointerException java.lang.NumberFormatException java.lang.RuntimeException java.lang.SecurityException