好死不死,蕃薯最近入手的一部ZenFone 5 3G版,安裝的第一個App就碰壁,一直以來都使用CSipSimple這套Softphone,沒想到安裝到ZenFone 5一開App就當掉,後來改用Zoiper IAX SIP VOIP Softphone就OK了。
上網搜到這篇: Issue 2829: Asus ZenFone always crash,以下這幾行:
11-13 12:47:43.732: D/dalvikvm(21207): No JNI_OnLoad found in /data/app-lib/com.sphene.sphene-2/libstlport_shared.so 0x437e6af0, skipping init
11-13 12:47:43.732: D/dalvikvm(21207): Trying to load lib /data/app-lib/com.sphene.sphene-2/libpjsipjni.so 0x437e6af0
11-13 12:47:43.752: A/libc(21207): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 21221 (ervice.Executor)
果然是該死的JNI在搞鬼,不知道什麼是JNI? 簡單的說,就是使用C或其他程式語言,編譯成binary code供Java(Android)呼叫使用,詳細說明請看維基百科: Java本地介面。這使蕃薯想起之前看過的另一篇: ZenFone Facebook 問題讓 x86 Android 相容難題再浮現,當初Facebook也遇到同樣的問題。
再來是App開發商的部份,蕃薯歸納出2種自行開發JNI的原因:
1. 控制特有的設備
由於Android Framework不提供該設備的API, 而必須自行撰寫,但一般的手機應該不會遇到這種狀況才是。2. 提升執行效能與佔用較少的記憶體
現在的手機CPU都是GHz等級,雙核、四核甚至八核心,RAM也都是GB以上,快個零點零幾秒或是省幾MB的記憶體,實在是感覺不出來。如果都用Android Framework開發程式,透過Dalvik跨平台執行就沒有問題,不解為什還要自行開發JNI而造成平台相依。對於這種狀況,除非廠商另外再釋出x86版本的App, 否則真的無解。
最後,蕃薯的建議是: 現階段Android還是以ARM為主流,購買手機能選ARM就選ARM, 否則難保下一個App不會遇到相容性的問題。
沒有留言:
張貼留言