بسم اللله الرحمن الرحيم باسمه نبدأ وعليه نتوكل
عالم J2ME الحقيقي هو العالم الذي ستراه في شركات البرمجه ان شاء الله وقدر ان تكون مبرمج J2ME وفيه سوف تجد بعض الاختلافات عن ما تعرفه عن J2ME التي تقرأها في الكتب أو تاخذها في دورات الجافا.
في هذا الدرس سوف اقدم لك واحد من أهم الاختلافات وهو ال Porting . هذه هي أول مره اكتب فيها مقالا تعليميا لذلك اعتذر عن اي اخطاء املائيه او اسلوبيه.
متطلبات الدرس: تحتاج لتطبيق هذا الدرس الى Netbeans 6.1 واذا اردت مشاهده النتائج العمليه للمشروع سوف تحتاج الى SonyEricsson SDK .
ما هو ال Porting ؟
هي عمليه تغيير بسيطه في كود المشروع لكي يعمل على أكبر قدر ممكن من الموبايلات. ولكن اليست جافا تعمل على الموبايلات التي تدعمها؟ هذا صحيح ولكن في حالات معينه تحتاج لاجراء بعض التعديلات كي يعمل برنامج على جميع الموبايلات.
ما هي الحالات التي احتاج فيها لعمل Porting ؟
1. وجود اخطاء في ال VM الموجوده على بعض الموبايلات وفي هذه الحاله سوف تقوم بعمل التفاف برمجي لكي يعمل مشروعك على ذلك الموبايل دون الحاجه الى عمل هذا التعديل لباقي الاجهزه حيث انها سوف تعمل بشكل صحيح.
مثال: Graphics.drawRegion لا تعمل بشكل صحيح على بعض اجهزه ال Nokia S40 لذلك يمكن عمل method بديله لها باستخدام g.setClip وتعطينا نفس النتائج دون استخدام هذا الالتفاف على اجهزه Nokia s60 مثلا.
2. اختلاف قدرات الاجهزه التي سوف يعمل عليها البرنامج, لنفترض انك تقوم بعمل برنامج يحدد مكانك ثم يظهر مكانك على الخريطه. في هذه الحاله يمكنك استخدام طريقتين لكي تحدد خط الطول والعرض. الاولى باستخدام ابراج الاتصالات والثانيه باستخدام الGPS. ولكن هل كل الاجهزه تحتوي على نظام GPS مدمج, بالطبع لا. في هذه الحاله عند ارسال برنامجي الى جهاز N95 مثلا يجب ان يحتوي البرنامج على الخيارين معا ام عند ارساله الى جهاز N73 فسارسل له نسخه من البرنامج لا تحتوي على خيار الGPS وهنا اتحدث عن ان النسخه لا تحتوي على كود قراءه الموقع من ال GPS وليس فقط عن اخفاء هذه الخاصيه.
والان كيف استطيع تطبيق ذلك باستخدام NetBeans لحسن الحظ فان NetBeans يساعدك على عمل ذلك بكل بساطه باستخدام Preprocessor Blocks.
ما هي ال Preprocessor Blocks ؟
هي عمليه التحكم بالكود الذي سوف تقوم بعمل Compile له بناء على الخواص التي تقوم انت بتحديدها.
مثال:
//#if SCREEN_240X320 public static final int WIDTH = 240; public static final int HEIGHT = 320; //#elif SCREEN_176X220 //# public static final int WIDTH = 176; //# public static final int HEIGHT = 220; //#endif
الذي في الاعلى وعليه فان نتيجه ال compile هي وجود متغيرين الاول WIDTH وقيمته 240 والثاني HEIGHT وقيمته 320 وهذا لاني اضفت الخاصيه SCREEN_240X320 الى مشروعي اما عند حذفها واضافه الخاصيه SCREEN_176X220 فان العكس تماما سوف يحدث واليك النتيجه:
//#if SCREEN_240X320 //# public static final int WIDTH = 240; //# public static final int HEIGHT = 320; //#elif SCREEN_176X220 public static final int WIDTH = 176; public static final int HEIGHT = 220; //#endif
والان لنجرب مثالا عمليا كاملا حتى تتضح الصوره:
1. في NetBeans اذهب الى File ثم New Project ثم Categories اختر Mobility ومن Projects اختر MIDP Application ثم Next .
2. في شاشه New Project ادخل Project Name ليكون PortingLesson تأكد انك اخترت Set As Main Project وازل الاختيار عن Create Hello MIDlet.
3. الان سوف نقوم بعمل Configurations للاجهزه التي سوف يعمل عليها برنامجي الاول سوف يكون SE P990 وهو ذو شاشه 240x320 ويدعم استخدام ال Pointer اما الجهاز الثاني وهو SE K750 وهو ذو شاشه 176X220 ولا يدعم استخدام ال Pointer . لذلك اضغط باليمين على المشروع وقم باختيار Properties في اعلى الشاشه عند Project Configuration قم باختيار Add Configuration والان ادخل الاسم وليكن P990 والان اعد الخطوات وليكن اسم الثاني K750 .
4. الان سوف نقوم بضبط الخصائص. باليمين على اسم المشروع ثم اختر Properties. تأكد ان تقف على P990 Configuration ثم اذهب الى تبويب Abilities ثم اضف الخاصيه SCREEN_240X320 والخاصيه SUPPORT_POINTER اعد الخطوات السابقه ولكن لل K750 ولكن في هذه المره اضف الخاصيه SCREEN_176X220 فقط.
5. والان سوف نحدد ما هو اسم ال Jar file لكل جهاز. باليمين على اسم المشروع ثم اختر Properties ثم تأكد انك تقف على ال P990 ثم اذهب ال Creating Jar ثم غير اسم ال Jar الى PortingLesson_P990.jar وال Jad الى PortingLesson_P990.jad اعد الخطوات السابقه لل K750 وسوف تصبح الاسماء على الترتيب PortingLesson_K750.jar , PortingLesson_K750.jad .
6. والان اضف ال Class الاول وهو MyMidlet :
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class MyMidlet extends MIDlet {
protected void startApp() throws MIDletStateChangeException {
MyCanvas c = new MyCanvas( this );
Display.getDisplay( this ).setCurrent( c );
}
protected void pauseApp() {
}
public void destroyApp(boolean arg) throws MIDletStateChangeException {
notifyDestroyed();
}
}7. اضف ال class الثاني وهو MyCanvas :
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.midlet.MIDlet;
public class MyCanvas extends Canvas {
public MyCanvas( MIDlet midlet ) {
this.midlet = midlet;
x = 0;
y = 0;
}
protected void showNotify() {
setFullScreenMode( true );
}
protected void paint(Graphics g) {
g.setColor( 0 );
g.fillRect(0, 0, WIDTH, HEIGHT);
g.setColor( 0xFFFFF );
g.drawString(
"Poring is important!",
x,
y,
Graphics.LEFT | Graphics.TOP
);
}
protected void keyPressed(int key) {
midlet.notifyDestroyed();
}
//#if SUPPORT_POINTER
protected void pointerPressed(int x, int y) {
this.x = x;
this.y = y;
repaint();
}
//#endif
//#if SCREEN_240X320
public static final int WIDTH = 240;
public static final int HEIGHT = 320;
//#elif SCREEN_176X220
//# public static final int WIDTH = 176;
//# public static final int HEIGHT = 220;
//#endif
private MIDlet midlet;
private int x;
private int y;
}8. والان لكي تحصل على برنامجك. باليمين على اسم المشروع ثم اختر Batch Deploy منها اختر ال P990 وال K750 . الان اذهب الى مجلد المشروع لتجد نسختين من برنامجك الولى ل P990 وهي تعمل على شاشه 240x320 وتستجيب لل Pointer والثاني ل K750 وهي تعمل على شاشه ال 176X220 .
ملاحظه: اذا اردت ان تجرب الفرق بين النسختين على جهازك يمكنك تحميل Sony Ericsson SDK وبعدها اضف ال emulators الى Netbeans ثم باليمين على اسم المشروع ثم Properties ثم Platform وهنك حدد ال Emulator الصحيح لكل Configuration .
يمكنك تحميل نسخه من المشروع ومن المقال من المرفقات
