博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
emoji表情引发的JNI崩溃
阅读量:6246 次
发布时间:2019-06-22

本文共 2679 字,大约阅读时间需要 8 分钟。

今天突然接到客服那边的反馈说,有玩家反馈进游戏后不久就崩溃了,我先是怀疑网络问题,因为一连接聊天成功后就挂了。之后用logcat抓日志,发现挂在jni那里了

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

string: ''

in call to NewStringUTF

from void org.cocos2dx.lib.Cocos2dxRenderer.nativeRender()

 

调用JNI的NewStringUTF方法就挂了,然后让后台把聊天日志全部拉出来,另存为html放到mac机上查看。发现一个特殊的表情,如下图所示:

 

我先让后台的同事,把所有聊天信息清理干净,这时候设备重新登录进去没有问题了。所以确定问题就是这个NewStringUTF方法引起的(但部分设备上有问题,部分设备没问题。看了一下好像是Android5.0及以后的系统就有此问题),问了其它同事,发现他们之前遇到过并且处理了。

有二种方案:一种是升级NDK,另外一种是C++传给Java时使用byte[],Java里再把byte[]转成String,避免NewStringUTF导致的崩溃。

 

我用的是cocos2d-x 2.x版本,找到CCImage.cpp文件,修改getBitmapFromJava方法

 

bool getBitmapFromJava(const char *text, int nWidth, int nHeight, CCImage::ETextAlign eAlignMask, const char * pFontName, float fontSize) {
    JniMethodInfo methodInfo;     if (! JniHelper::getStaticMethodInfo(methodInfo, "org/cocos2dx/lib/Cocos2dxBitmap", "createTextBitmap",         "([BLjava/lang/String;IIII)V"))     {
        CCLOG("%s %d: error to get methodInfo", __FILE__, __LINE__);         return false;     }     /**create bitmap      * this method call Cococs2dx.createBitmap()(java code) to create the bitmap, the java code      * will call Java_org_cocos2dx_lib_Cocos2dxBitmap_nativeInitBitmapDC() to init the width, height      * and data.      * use this appoach to decrease the jni call number     */     int strLen = strlen(text);     jbyteArray byteArray = methodInfo.env->NewByteArray(strLen);     methodInfo.env->SetByteArrayRegion(byteArray, 0, strLen, reinterpret_cast
(text)); //        jstring jstrText = methodInfo.env->NewStringUTF(text);     jstring jstrFont = methodInfo.env->NewStringUTF(pFontName);     methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, byteArray,         jstrFont, (int)fontSize, eAlignMask, nWidth, nHeight); //        methodInfo.env->DeleteLocalRef(jstrText);     methodInfo.env->DeleteLocalRef(byteArray);     methodInfo.env->DeleteLocalRef(jstrFont);     methodInfo.env->DeleteLocalRef(methodInfo.classID);     return true; }

注释部分为原来的代码,将string替换为byte[]再传给Java即可,其它地方如果也遇到JNI崩溃的问题,也按上面进行修改即可。

符一个字符串与jbyteArray的互转函数

jbyteArray as_byte_array(unsigned char* buf, int len) {
    jbyteArray array = env->NewByteArray(len);     env->SetByteArrayRegion(array, 0, len, reinterpret_cast
(buf));     return array; }   unsigned char* as_unsigned_char_array(jbyteArray array) {
    int len = env->GetArrayLength(array);     unsigned char* buf = new unsigned char[len];     env->GetByteArrayRegion(array, 0, len, reinterpret_cast
(buf));     return buf; }
 

mysql 5.5之前仅支持3个字节,如果游戏中有留言等功能要存进数据库的记录,那么你就需要过滤这些字符了,不然就会插入数据报错。

 

更多阅读链接:

 

转载地址:http://horia.baihongyu.com/

你可能感兴趣的文章
如何申请开通微信多客服功能
查看>>
Linux coredump
查看>>
Ubuntu 10.04安装水晶(Mercury)无线网卡驱动
查看>>
我的友情链接
查看>>
ElasticSearch 2 (32) - 信息聚合系列之范围限定
查看>>
windows查看端口占用
查看>>
Yii用ajax实现无刷新检索更新CListView数据
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
南京大学周志华教授当选欧洲科学院外籍院士
查看>>
计算机网络与Internet应用
查看>>
Mars说光场(3)— 光场采集
查看>>
Django 文件下载功能
查看>>
xBIM 插入复制功能
查看>>
AI技术出海 - 阿里云GPU服务器助力旷视勇夺4项世界第一
查看>>
Spring Boot中初始化资源的几种方式
查看>>
走红日本 阿里云如何能够赢得海外荣耀
查看>>
玩笑到现实,大数据涉足文学研究--用数据模型分析莎翁著作
查看>>
[小程序] mpVue 踩坑
查看>>