Google输入法调用抛出JNI错误

  昨天收到个Bug,是关于Google输入法调用后报异常,Log信息大概是说找不到JNI方法nativeImOpenDecoder(),

后发现在编译此版本系统前的TARGET_BUILD_VARIANT选项是user,和平时用的eng有所不同,重新烧了eng和user版本验证下确实有此问题,刚开始想都没想直接就去看Make脚本了,因为一定有所不同,看了半小时后头昏眼花,最主要是没看太明白,放弃。。。

  后拿来user版和eng版的GooglePinyin.apk比较了下,发现user版的大小少了100多byte,原来缺少代码,网上一顿

搜罗反编译工具,最后确定在PinyinDecoderService.java类里缺少nativeImOpenDecoder()方法,此方法是native方法,所以在加载.so文件时没有找到该方法报出异常,又在项目中查找下引用,才知道整个项目任何并没有调用过此方法,到此可以判断出在编译的时候系统做了优化,把无用的代码做了过滤。好,那我就在编译时强制保留此方法,了解到Android系统编译是用ProGuard来进行代码优化和混淆工作的,OK,参照别的Android.mk文件加了参数:

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

 

又创建了proguard.flags文件,内容如下:

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

 

最后重新编译并测试,可成功调用Google输入法。

  总结下,在编译代码过程中ProGuard起了关键作用,所以了解还是非常必要的,特转以下文章地址来学习下:

 

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值