C/C++ >> JNI >> Android
ခုနောက်ပိုင်းမှာ mobile ဖုန်းကို ဖုန်းဆက်ဖို့ အတွက်ဘဲ လို့ မယူဆကြတော့ပါဘူး။ ကိုယ်ပိုင် personal handheld pc သဖွယ်ကို ဖြစ်လာကြပါပြီ။ application ကလည်း မျိုးစုံထွက်ပေါ်နေဆဲပါဘဲ။ ဖုန်းတစ်လုံးရှိတာနဲ့တင်ကို အလုပ်ဖြစ်နေပါပြီ။ ဖုန်းထဲကနေ internet သုံးမလား၊ bank account စစ်မှာလား ၊ shopping လား၊ soft multitouch နဲ့ piano တီးမှာလား၊ E-book တွေဖတ်မလား အဲ့ဒီလိုဖတ်တဲ့နေရာမှာ ကိုယ့်ရဲ့ SD card (memory) ထဲမှာရှိတာကိုဘဲဖတ်မှာလား cloud ကနေလှမ်းဖတ်မှာလား ပြောရင်တော့ မကုန်နိုင်လောက်တဲ့ အခြေနေတစ်ရပ်ပါ။ အဲ့ဒီလိုမျိုး E-book reader application တွေကို implement လုပ်ဖို့ဆိုရင်တော့ PDF format , EPUB format တွေကို rendering လုပ်ပေးမယ့် SDK တွေကို ကိုယ့် ရဲ့ Android platform မှာ embed လုပ်ပြီး သုံးလာကြပါတယ်။ ဒါပေမယ့် Foxit SDK Library က C/C++ Language နဲ့ရေးထားတာ။ ဒါကြောင့် အဲ့ဒီ library ထဲက data ကိုခေါ်ချင်ရင် အလယ်ကနေ ကြားခံ native JNI library ဆောက်ရမှာပါ။ JNI library ဆောက်ပြီးရင်တော့ library ထဲကနေ native code နဲ့ရေးထားတာတွေကို Java code နဲ့ခေါ်နိုင်မှာပါ။ Google Android မှာ Android NDK ဆိုတာပါပါတယ်။ Android NDK က developer တွေကို ကိုယ်ပိုင် JNI library ဆောက်လို့ရအောင် လုပ်ထားပေးပါတယ်။
Java Native Interface(JNI)
Java Native Interface ဆိုတာ တခြားသော languages C/C++/assembly စတာတွေနဲ့ ရေးထားတဲ့ libraries တွေကို Java code တွေနဲ့ run နိုင်စေတဲ့ native programming interface တစ်ခုပါ။ ဒါကြောင့် Java programming language နဲ့ အပြည့်အဝ မရေးနိုင်တဲ့ application တွေဆိုရင် programmers တွေ JNI ကို သုံးပြီး native methods တွေကို handle လုပ်လေ့ရှိပါတယ်။
ဥပမာအနေနဲ့ ပြောရမယ်ဆိုရင်တော့ သင်ဟာ အောက်မှာ ဆွေးနွေးပြထားတဲ့ အခြေအနေမျိုးမှာဆိုရင် native method နဲ့ JNI တွေသုံးဖို့ လိုအပ်လာပါလိမ့်မယ်။
၁. တခြား programming language နဲ့ရေးထားတဲ့ library တွေ application တွေရှိပြီးသားဖြစ်ပြီး Java application ကနေယူသုံးချင်လာရင်
၂. Low –level programming ဖြစ်တဲ့ assembly နဲ့ရေးထားတဲ့ time-critical code အပိုင်းသေးသေးလေးတစ်ခုတည်းကိုဘဲ implement လုပ်ချင်လာရင် JNI သုံးပါမယ်။
JNI ဘယ်လို အလုပ်လုပ်လဲ?
JNI framework ထဲမှာ native functions တွေဟာ သီးခြား .c .cpp file အနေနဲ့ implemented လုပ်ထားပါတယ်။ JVM ကသာ အဲ့ဒီ function တွေကို ခေါ်လို်က်တယ်ဆိုရင် JNIEnv pointer, jobject pointer နဲ့ Java method ကနေကြေငြာထားတဲ့ Java arguments တွေကို pass လုပ်ပေးပါတယ်။
// အောက်မှာရေးပြထားတဲ့ *env ဆိုတဲ့ pointer လေးဟာ JVM အတွက် interface တွေပါတဲ့ structure တစ်ခုပါ။
JNIEXPORT void JNICALL Java_ClassName_MethodName
(JNIEnv *env, jobject obj)
{
/*Implement Native Method Here*/
}
Native data type ဟာ Java data type ကို mapping သွားလုပ်နိုင်ပါတယ်။ compound types တွေဖြစ်တဲ့ objects တို့ arrays တို့ strings တွေကို native code က JNIEnv မှာပါတဲ့ methods ကို ခေါ်ခြင်းအားဖြင့် သက်ဆိုင်ရာ data typel အဖြစ်ပြောင်းပေးလိုက်ပါတယ်။
အောက်က ပုံလေးကတော့ JNI ကဘယ်လိုမျိုး C side က application တွေကို Java side ကို ပြောင်းပေးလဲဆိုတာ ပြချင်တာပါ။
ဒီတော့ JNI နဲ့ native method တွေသုံးခြင်းရဲ ့ကောင်း ပြစ်ဆိုးပြစ်တွေကို ဝေဖန်ကြည့်ရအောင်။
Advantages
- တခြား language နဲ့ ရေးထားတဲ့ ရှိပြီးသား libraries တွေကို ထပ်ရေးစရာမလိုတော့ပါဘူး။
- C ကိုသုံးပြီး code ရေးရတာ လျော့ကျသွားပါတယ်။
Difficulties
- Java ရဲ့ တချို့သော ကောင်းကွက်တွေကို လက်လွှတ်လိုက်ရတာမျိုးဖြစ်နိုင်ပါတယ်။ ဥပမာ C မှာဆိုရင် Java လိုမျိုး garbage collection မပါတဲ့အတွက် အဲ့ဒီလိုမျိုးအလုပ်တွေ လိုက်လုပ်နေရတဲ့ အတွက် အလုပ်ပိုလာနိုင်ပါတယ်။
- JNI မှာ exception mechanism မရှိပါဘူး။
- Memory management နဲ့ပတ်သက်ပြီး ကောင်းကောင်းဂရုစို်က်ဖို့လိုလာပါတယ်။ ဥပမာအနေနဲ့ပြောရမယ်ဆိုရင် instance တွေကို release ပြန်လုပ်တာ။
Android NDK tool
Android NDK ဆိုတဲ့ toolset ကတော့ Android application developers တွေကို သူတို့ application ရဲ ့Performance-critical အပိုင်းကို native code တွေနဲ့ built လုပ်ဖို့ ခွင့်ပြုပါတယ်။ Android application က Dalvik virtual machine ပေါ်မှာ run ပြီး NDK ကတော့ developer တွေကို native-code language ဖြစ်တဲ့ C/C++ နဲ့ implement လုပ်စေပါတယ်။ runtime speed ကိုလည်း မြန်စေပါတယ်။ ဒါပေမယ့် application တိုင်းအတွက်တော့ ကောင်း တာမဟုတ်ဘူးနော်။ complexity ဖြစ်လာမှာကတော့ ကျိန်းသေပါတယ်။ ဒါကြောင့် native code သုံးသင့် မသုံးသင့် ကောင်းကျိုးဆိုးကျိုး ချိန်ဆဖို့တော့ လိုမယ်နော်။
NDK ထဲမှာ ဘာတွေပါလဲဆိုရင်
၁. Native ARM binaries တွေ generate လုပ်ပေးနိုင်တဲ့ Cross-toolchain တွေဖြစ်တဲ့ (compiler, linker, စတာတွေ…)
၂. Built system file: သူကတော့ build files ထဲမှာ describe လုပ်ထားတဲ့ C နဲ့ C++ sources (JNI) တွေကို compile လုပ်ပေးပြီး ကိုယ်ရဲ ့ application project မှာ shared လုပ်ထားတဲ့ library တွေကို နေရာချပေးပါတယ်။
၃. System headers တွေဖြစ်တဲ့ C နဲ့ math library header တွေ၊ JNI interface headers တွေပါပါတယ်။
ဒီပုံမှာတော့ C language နဲ့ရေးထားတဲ့ Foxit SDK library ကိုသုံ:ပြီး Android platform ကနေ Java language နဲ့ ကိုယ့် application ကို develop လုပ်နိုင်ပါတယ်။ Android NDK က Android SDK 1.5 ကတည်းက ပါလာခဲ့တာပါ။
ဆက်လက်ရေးသားဆဲ…
Ref:
- JNI Examples for Android by Jurij Smakov
- Effective GUI Design and Memory Usage Management
- Content Reading Management for E-book Reader Based Android Client
p.s. I am in my learning step, now. Please inform and give suggestion if there is an err in my idiot translation!
Facebook comments:





[...] ၁၂. C/C++ >> JNI >> Android [...]
[...] အခုမှ စဖတ်မည့်သူများအတွက် Android VM က ကိုယ့်ရဲ့ application’s source code ထဲမှာ native code နဲ့ implemented လုပ်ထားတဲ့ source code တွေကို JNI ကတဆင့် ခေါ်နိုင်ပါတယ် ဆိုတာ C/C++ >> JNI >> Android (1) မှာသွားရောက်ဖတ်ရှနိုင်ပါတယ်။ [...]