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
ไม่ว่าจะเป็น 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