>>> Let's run Python on Mobile

วันพฤหัสบดี, พฤษภาคม 18, 2549

JNI,When Java meet C++,and Rule them all with Jython

หลายๆFunctionใน SmartPhone ดูไปคล้ายๆกับจะพยายามบังคับ ให้เราไปใช้ C++ เขียนโปรแกรม ยังไงก็ไม่รู้
ไม่ว่าจะเป็น PhoneMakeCall ,SmsSendMessage ,PlaySound
ถ้าจะใช้ C# ก็ใช้ PInvoke แก้ปัญหาไปได้บ้าง
แต่ถ้าจะพยายามเรียกใช้ คำสั่งเหล่านี้ ด้วย Java หรือ Jython ก็สามารถทำได้ โดยใช้
JNI หรือ Java Native Interface

หลักการง่ายๆก็คือ เขียนโปรแกรมด้วย Java กำหนดไว้ว่า จะเรียกใช้คำสั่งอะไรบ้าง
แล้วก็ เขียน Native Code ด้วย C/C++ จัดเตรียมเป็นไฟล์ .DLL ไว้ให้ Java เรียกใช้
เนื่องจาก Jython เป็น Python ที่เป็น Pure Java
Jython ก็สามารถใช้ Java ให้ไปเรียก Native Code เหล่านี้ได้ด้วย

วิธีการใช้ JNI
1.เขียนโปรแกรมด้วย Java กำหนด Native Method,loadLibrary
2.compile เป็นไฟล์ .class
3.ไช้ไฟล์ .class สร้างไฟล์ .h
4.นำไฟล์ .h ไป include เวลาเขียนโปรแกรมด้วย C/C++
5.เขียนโปรแกรมด้วย C/C++ เป็นไฟล์ .DLL
6.run โปรแกรม โดยมี ไฟล์ .DLL ที่ได้อยู่ใน path
และ ไฟล์ .class ที่ได้อยู่ใน classpath

ขอยกตัวอย่างบน PC ก่อน
ไฟล์ jni01.java ดังตัวอย่างถัดไป
มีการเรียกใช้ไฟล์ HelloWorld.dll โดยใช้คำสั่ง
System.loadLibrary("HelloWorld")
อยู่ใน static block

มีการกำหนด Native Method ชื่อว่า print โดยใช้คำสั่ง
public native void print();
มีคำว่า native และปิดด้วย ; ทันที
โดยรายละเอียดของ print จะอยู่ใน HelloWorld.dll ซึ่งจะไว้เขียนทีหลัง

ต่อมาก็ compile ไฟล์ jni01.java ได้ไฟล์ jni01.class ออกมา
แล้วสร้างไฟล์ jni01.h โดยใช้คำสั่ง
javah -classpath . jni01

ไฟล์ jni01.h ที่ได้นำไปใช้ใน C++ เพื่อสร้างไฟล์ HelloWorld.dll
โดยในไฟล์ HelloWorld.cpp นี้จะต้อง include
-ไฟล์ jni01.hเพิ่งสร้างเสร็จนี้ และ
-ไฟล์ jni.h ที่อยู่ใน JDK
จะเห็นว่าคำสั่ง print ของ Java ใน C++ จะเปลี่ยนชื่อเป็น Java_jni01_print
คำสั่ง Java_jni01_print นี้ มีการเรียกใช้ printf ใน C++

นำไฟล์ HelloWorld.DLL และ ไฟล์ jni01.class ที่ได้ ไป run
เช่น จากรูปข้างล่าง มี HelloWorld.DLL ,jni01.class อยู่ที่ C:

ลองเรียกจาก Jython ดูบ้าง

คราวหน้า จะมาต่อ ด้วยการใช้ JNI กับ PersonalJava บน Smartphone ครับ
รายละเอียดเรื่อง JNI อ่านได้ที่นี่
E-book JNI
ตัวอย่าง Code helloworld.zip