1. 程式人生 > >Google輸入法呼叫丟擲JNI錯誤

Google輸入法呼叫丟擲JNI錯誤

  昨天收到個Bug,是關於Google輸入法呼叫後報異常,Log資訊大概是說找不到JNI方法nativeImOpenDecoder()

後發現在編譯此版本系統前的TARGET_BUILD_VARIANT選項是user,和平時用的eng有所不同,重新燒了enguser版本驗證下確實有此問題,剛開始想都沒想直接就去看Make指令碼了,因為一定有所不同,看了半小時後頭昏眼花,最主要是沒看太明白,放棄。。。

  後拿來user版和eng版的GooglePinyin.apk比較了下,發現user版的大小少了100byte,原來缺少程式碼,網上一頓

蒐羅反編譯工具,最後確定在

PinyinDecoderService.java類裡缺少nativeImOpenDecoder()方法,此方法是native方法,所以在載入.so檔案時沒有找到該方法報出異常,又在專案中查詢下引用,才知道整個專案任何並沒有呼叫過此方法,到此可以判斷出在編譯的時候系統做了優化,把無用的程式碼做了過濾。好,那我就在編譯時強制保留此方法,瞭解到Android系統編譯是用ProGuard來進行程式碼優化和混淆工作的,OK,參照別的Android.mk檔案加了引數:

   LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags

 

又建立了proguard.flags檔案,內容如下:

    -keepclass com.android.inputmethod.pinyin.PinyinDecoderService {
    static *;
    }

 

最後重新編譯並測試,可成功呼叫Google輸入法。

  總結下,在編譯程式碼過程中ProGuard起了關鍵作用,所以瞭解還是非常必要的,特轉以下文章地址來學習下:

 

http://www.cnitblog.com/zouzheng/archive/2011/01/12/72639.html