那些年Android开发遇到的坑(JNI 之 Illegal start byte 0xfe)
公司构建了自己的推送系统,我们的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)相关推荐
- Android NDK JNI WARNING: illegal start byte 0x
今天攻克了JNI WARNING: illegal start byte 0x81这个问题. 问题出现的现象是通过jni调用加密方法,调用之后返回密文内容,结果就出现这个问题. 在国外查找一段时间之后 ...
- Android开发教程--第一个JNI程序
先配置NDK环境,网上教程很多.安装cygwin,此过程省略,如有不懂的地方可以百度. NDK路径D:\cygwin\home\Administrator 编辑.bash_profile这个文件 添加 ...
- Android开发遇到的坑-----融云聊天接收到但不能显示
问题 在使用融云的时候,遇到如果对方给我发送消息,那么我的会话界面不会立即显示这条消息,必须要退出会话界面,再次进入才能显示 解决办法 其实是自己不仔细的原因,融云的两个不同对象都有 connect( ...
- androidstudio jni开发_高考失利落榜,7年Android开发现已年薪60w,我的逆袭之路想说给你听...
今天是高考的日子,首先祝愿所有高考学子都能金榜题名.旗开得胜. 大学的目标 这篇文章,想讲讲我的一些经历故事,如果你想入行编程.或者在一两年编程经验的迷茫时期.相信这篇文章可以给你带来帮助. 回想7年 ...
- 【 持续更新 】Android开发笔记汇总篇,爬各种坑,敲高效代码,各种奇难杂症,有您要治的病 。
[持续更新]Android开发笔记汇总篇,爬各种坑,敲高效代码,各种奇难杂症,有您要治的病 . 一.AndroidStudio 开发工具的那些事 . 问题 1: AndroidStudio2.2以上在 ...
- 开发工具总结(4)之Android Studio3.0填坑指南
序言 Android Studio 3.0 上篇讲了: 全面总结Android Studio2.X的填坑指南 这篇讲一下AS3.0的坑.. 作为这个世界上走在最前沿的生物"猿",怎 ...
- Android开发笔记(六十九)JNI实战
NDK NDK的用途 NDK全称为Native Development Kit,意即原生的开发工具,NDK允许开发者在APP中通过C/C++代码执行部分程序.它是Android提供的方便开发者通过JN ...
- Android开发实践:Java层与Jni层的数组传递
Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...
- android开发JNI之高级篇
android开发JNI之高级篇 一,JNI介绍 百度百科 : http://baike.baidu.com/view/1272329.htm 二,JNI开发教程 1,JNI注册方式有两种,一种是静态 ...
- android 软电话 开发包-JNI 封装 SIP 协议,可进行二次开发应用于VOIP
android 软电话 开发包-JNI 封装 SIP 协议,可进行二次开发应用于VOIP 该开发包为android平台下的JNI开发包,符合标准SIP协议,支持G729语音编码. 下载地址:源代码地址 ...
最新文章
- 震惊!评审专家将论文拒稿后修改发表
- 当女朋友生气了而你却没发现 !!!
- Distributed Representations of Sentences and Documents
- Spark源码分析之SparkContext
- 三星Galaxy 首款运动腕表全新渲染图曝光
- 中央民族大学计算机专业研究生,信息工程学院
- JS 实现两表格里的数据来回 转移
- c++ 一维高斯拟合_χ2检验教案:拟合度检验与正态分布的关系
- 传感器到底在“偷窥”什么
- Android Studio 1.0来啦
- TensorLy-神经网络张量库
- 《web课程设计》期末网页制作 基于HTML+CSS+JavaScript制作公司官网页面精美
- 两款个人知识库管理软件下载
- YOLO v4 图片批量测试
- 从零开始用 Windows C++ 桌面程序制作方舟同人游戏(五)
- jersey restful 测试_Jersey 开发RESTful(七)Jersey快速入门
- html给图片添加边框
- AD18设计PCB时常见问题及操作
- springboot实战,实现发送邮件,gmail邮件,包括发送附件还有正文,以及注意覆盖问题
- 4/2 三元表达式/函数递归/匿名函数/内置函数