公司构建了自己的推送系统,我们的app的推送也有极光推送改为了自己的推送。在使用我们自己的推送的过程中,推送纯文字一切正常,但如果推送内容中含有特殊表情(比如这样的 ),在一部分Android机器(红米3,努比亚)上就会出现异常。异常如下:

JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xfe。

我再网上百度了下产生的原因如下:这个异常是由于Java虚拟机内部的 dalvik/vm/CheckJni.c中的 checkUtfString函数抛出的,JVM的这个接口不支持四个字节的UTF8字符。在我的仔细检查下找到了问题发生的地方 :
jstring msg= (*env)->NewStringUTF(env, msg);
而这msg就是jni调用java方法返回给客户端的需要处理的一个JSONString。在网上也有人给出了解决方法(调用函数之前,对接口传入的字符串进行过滤。可以参考这个链接http://www.mobibrw.com/2016/2859)。但这个方法我们不可以使用(产品要求昵称可以含有表情)。Google了好久,发现了一个解决方法:让jni返回给java层byte[] ,在java层将byte[]转换成String字符串然后处理。果然在我的尝试下这个问题就这样解决了。
修改后的关键代码如下
jni层的处理如下
jmethodID g_mid = (*env)->GetMethodID(env, g_clazz,"callback","(Ljava/lang/String;[B)V");
jbyteArray byteArray = (*env)->NewByteArray(env,payload_size);
(*env)->SetByteArrayRegion(env,byteArray, 0, payload_size, payload);
(*env)->CallVoidMethod(env, g_obj, g_mid, jappid, byteArray);

java层jni调用的方法如下
public void callback(String appId, byte[] data) {if(data==null) return;String msg=new String(data);if (!TextUtils.isEmpty(saveLog(GPushClient.getLogFilePath(), msg);Intent intent = new Intent();intent.setAction(GPushClient.MESSAGE_RECEIVED_ACTION);intent.putExtra(GPushClient.EXTRA, msg);mContext.sendBroadcast(intent);}
}

第一次发博客,有什么不正确的欢迎指正,有什么疑问也可以联系我邮箱:972876901@qq.com

那些年Android开发遇到的坑(JNI 之 Illegal start byte 0xfe)相关推荐

  1. Android NDK JNI WARNING: illegal start byte 0x

    今天攻克了JNI WARNING: illegal start byte 0x81这个问题. 问题出现的现象是通过jni调用加密方法,调用之后返回密文内容,结果就出现这个问题. 在国外查找一段时间之后 ...

  2. Android开发教程--第一个JNI程序

    先配置NDK环境,网上教程很多.安装cygwin,此过程省略,如有不懂的地方可以百度. NDK路径D:\cygwin\home\Administrator 编辑.bash_profile这个文件 添加 ...

  3. Android开发遇到的坑-----融云聊天接收到但不能显示

    问题 在使用融云的时候,遇到如果对方给我发送消息,那么我的会话界面不会立即显示这条消息,必须要退出会话界面,再次进入才能显示 解决办法 其实是自己不仔细的原因,融云的两个不同对象都有 connect( ...

  4. androidstudio jni开发_高考失利落榜,7年Android开发现已年薪60w,我的逆袭之路想说给你听...

    今天是高考的日子,首先祝愿所有高考学子都能金榜题名.旗开得胜. 大学的目标 这篇文章,想讲讲我的一些经历故事,如果你想入行编程.或者在一两年编程经验的迷茫时期.相信这篇文章可以给你带来帮助. 回想7年 ...

  5. 【 持续更新 】Android开发笔记汇总篇,爬各种坑,敲高效代码,各种奇难杂症,有您要治的病 。

    [持续更新]Android开发笔记汇总篇,爬各种坑,敲高效代码,各种奇难杂症,有您要治的病 . 一.AndroidStudio 开发工具的那些事 . 问题 1: AndroidStudio2.2以上在 ...

  6. 开发工具总结(4)之Android Studio3.0填坑指南

    序言 Android Studio 3.0 上篇讲了: 全面总结Android Studio2.X的填坑指南 这篇讲一下AS3.0的坑.. 作为这个世界上走在最前沿的生物"猿",怎 ...

  7. Android开发笔记(六十九)JNI实战

    NDK NDK的用途 NDK全称为Native Development Kit,意即原生的开发工具,NDK允许开发者在APP中通过C/C++代码执行部分程序.它是Android提供的方便开发者通过JN ...

  8. Android开发实践:Java层与Jni层的数组传递

    Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...

  9. android开发JNI之高级篇

    android开发JNI之高级篇 一,JNI介绍 百度百科 : http://baike.baidu.com/view/1272329.htm 二,JNI开发教程 1,JNI注册方式有两种,一种是静态 ...

  10. android 软电话 开发包-JNI 封装 SIP 协议,可进行二次开发应用于VOIP

    android 软电话 开发包-JNI 封装 SIP 协议,可进行二次开发应用于VOIP 该开发包为android平台下的JNI开发包,符合标准SIP协议,支持G729语音编码. 下载地址:源代码地址 ...

最新文章

  1. 震惊!评审专家将论文拒稿后修改发表
  2. 当女朋友生气了而你却没发现 !!!
  3. Distributed Representations of Sentences and Documents
  4. Spark源码分析之SparkContext
  5. 三星Galaxy 首款运动腕表全新渲染图曝光
  6. 中央民族大学计算机专业研究生,信息工程学院
  7. JS 实现两表格里的数据来回 转移
  8. c++ 一维高斯拟合_χ2检验教案:拟合度检验与正态分布的关系
  9. 传感器到底在“偷窥”什么
  10. Android Studio 1.0来啦
  11. TensorLy-神经网络张量库
  12. 《web课程设计》期末网页制作 基于HTML+CSS+JavaScript制作公司官网页面精美
  13. 两款个人知识库管理软件下载
  14. YOLO v4 图片批量测试
  15. 从零开始用 Windows C++ 桌面程序制作方舟同人游戏(五)
  16. jersey restful 测试_Jersey 开发RESTful(七)Jersey快速入门
  17. html给图片添加边框
  18. AD18设计PCB时常见问题及操作
  19. springboot实战,实现发送邮件,gmail邮件,包括发送附件还有正文,以及注意覆盖问题
  20. 4/2 三元表达式/函数递归/匿名函数/内置函数

热门文章

  1. 信息系统项目管理师知识记忆口诀
  2. 《Redis开发与运维》第一章 初识Redis 读书笔记
  3. 一个专业搬砖人的幻想:全国实现旬休制度
  4. 操作系统动态分区分配方式的模拟实现(分配与回收)C++
  5. Excel宏编程,给出2列进行去重合并
  6. 《Java SE编程365例》003: 我的电子书城
  7. Microsoft Office Word无法执行语言识别怎么办
  8. python编程实例题目
  9. 高等代数 多项式环(第7章)5* 结式与域
  10. java时间日期相减得到天数_java日期相减得到天数