今天android上Jni返回jstring给java层,概率性的出现上述异常,网上看过解决方案,说修改jvm的什么代码,其实我们做应用层的哪有改这个的能力根本不现实的,后面继续查找最后自己解决的。

网上说的解决方案,链接如下:JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xfe - a318013800 - 博客园JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xfe 在使用Jnihttps://www.cnblogs.com/pengmn/p/9183612.html

我提供的解决办法:

一、将jstring 改成 jbyteArray 也就是java层的byte[] 到java层再转成String

二、jni层直接将char* 转换成base64编码的字符串然后返回也能解决,jni转base64的代码如下。

以上两种方法都可以根据自己的喜好选择,可以规避上述异常。

typedef unsigned char     uint8;
typedef unsigned long    uint32;static uint8 alphabet_map[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static uint8 reverse_map[] ={255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 255, 255, 255,255,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255};uint32 base64_encode(const uint8 *text, uint32 text_len, uint8 *encode)
{uint32 i, j;for (i = 0, j = 0; i+3 <= text_len; i+=3){encode[j++] = alphabet_map[text[i]>>2];                             //取出第一个字符的前6位并找出对应的结果字符encode[j++] = alphabet_map[((text[i]<<4)&0x30)|(text[i+1]>>4)];     //将第一个字符的后2位与第二个字符的前4位进行组合并找到对应的结果字符encode[j++] = alphabet_map[((text[i+1]<<2)&0x3c)|(text[i+2]>>6)];   //将第二个字符的后4位与第三个字符的前2位组合并找出对应的结果字符encode[j++] = alphabet_map[text[i+2]&0x3f];                         //取出第三个字符的后6位并找出结果字符}if (i < text_len){uint32 tail = text_len - i;if (tail == 1){encode[j++] = alphabet_map[text[i]>>2];encode[j++] = alphabet_map[(text[i]<<4)&0x30];encode[j++] = '=';encode[j++] = '=';}else //tail==2{encode[j++] = alphabet_map[text[i]>>2];encode[j++] = alphabet_map[((text[i]<<4)&0x30)|(text[i+1]>>4)];encode[j++] = alphabet_map[(text[i+1]<<2)&0x3c];encode[j++] = '=';}}return j;
}uint32 base64_decode(const uint8 *code, uint32 code_len, uint8 *plain)
{assert((code_len&0x03) == 0);  //如果它的条件返回错误,则终止程序执行。4的倍数。uint32 i, j = 0;uint8 quad[4];for (i = 0; i < code_len; i+=4){for (uint32 k = 0; k < 4; k++){quad[k] = reverse_map[code[i+k]];//分组,每组四个分别依次转换为base64表内的十进制数}assert(quad[0]<64 && quad[1]<64);plain[j++] = (quad[0]<<2)|(quad[1]>>4); //取出第一个字符对应base64表的十进制数的前6位与第二个字符对应base64表的十进制数的前2位进行组合if (quad[2] >= 64)break;else if (quad[3] >= 64){plain[j++] = (quad[1]<<4)|(quad[2]>>2); //取出第二个字符对应base64表的十进制数的后4位与第三个字符对应base64表的十进制数的前4位进行组合break;}else{plain[j++] = (quad[1]<<4)|(quad[2]>>2);plain[j++] = (quad[2]<<6)|quad[3];//取出第三个字符对应base64表的十进制数的后2位与第4个字符进行组合}}return j;
}

参考了下面的这个文章:

C++实现base64编解码 - Weisswire - 博客园C++实现base64编解码https://www.cnblogs.com/Severus-Cavendish/p/11623240.html

JNI JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8:xxxx异常相关推荐

  1. JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0x9e 解决方案

    在vivo设备上 调用 jstring str = env->NewStringUTF(charResult); 出现闪退问题报错:JNI DETECTED ERROR IN APPLICATI ...

  2. Android之JNI DETECTED ERROR IN APPLICATION: illegal class name ‘XXX‘的错误解决方法

    1.问题 JNI DETECTED ERROR IN APPLICATION: illegal class name 'com.example.chenyu.test.JniClient' 2.原因 ...

  3. JNI DETECTED ERROR IN APPLICATION: jarray was NULL

    项目中用到了opengles去展示三维点云数据,个人比较生疏,所以打算学一学.根据官方的示例先画了一个三角形,后面在画方形的时候怎么都不成功,报错:JNI DETECTED ERROR IN APPL ...

  4. ByteBuffer.allocate()/ByteBuffer.allocateDirect()/JNI DETECTED ERROR IN APPLICATION: jarray was NULL

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  5. android jni黑屏,android使用高德地图出现诡异的:JNI DETECTED ERROR IN APPLICATION

    今天用 android studio 写程序踩到这个诡异的坑: 首先介绍使用的开发工具和环境:android studio 测试机型:红米note2: android 5.0.2 是这样的:笔者程序中 ...

  6. JNI DETECTED ERROR IN APPLICATION: can't call void com.example.wxy.ndks.Utils.fun3() on instance of

    //cmake使用 JNIEXPORT void JNICALL Java_com_example_wxy_ndks_Utils_funs2(JNIEnv *env, jobject instance ...

  7. [USF-XSim-62] ‘elaborate‘ step failed with errors.[Vivado 12-4473] Detected error while running sim

    [USF-XSim-62] 'elaborate' step failed with error(s). Please check the Tcl console output .and [Vivad ...

  8. 【.net部署】Server Error in ‘/‘ Application.错误解决方案

    [.net部署]Server Error in '/' Application.错误解决方案 参考文章: (1)[.net部署]Server Error in '/' Application.错误解决 ...

  9. OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (wher

    OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (wher ...

最新文章

  1. Log4j2又爆雷!2.16.0存在DOS攻击风险,升级到2.17.0可解决!
  2. Unity3D Image 组件附入图片问题
  3. 网关和路由器的区别是什么?
  4. es6 var、let、const命令
  5. 百度编辑器ueditor自适应手机端
  6. 《指针的编程艺术(第二版)》一3.8 改错题
  7. nginx重启无法找到PId的解决办法
  8. match_parent和fill_parent有什么区别?
  9. Python2.x vs Python3
  10. 3.工作组环境下的应用
  11. 安卓使用MediaPlayer播放RTSP无画面的解决办法
  12. [文档].Altera - Nios II Flash Programmer用户指南
  13. 计算机大学生职业规划书word模板,大学生职业生涯规划书模板(附word)
  14. html手写笔记照片,Myscript Nebo – 好用到哭的手写笔记软件!你只管写画,它帮你识别转换成文字 | 火星博客...
  15. prototype鼠标指针_html5鼠标点击页面光标圆点动画特效
  16. C#开发金蝶K3插件
  17. 链路追踪google dapper论文 中文
  18. 实验吧-CTF-web-头有点大貌似有点难看起来有点难(学习笔记)
  19. xShell6远端登录Linux登录错误Connecting to 192.168.112.128:22... Could not connect to ‘192.168.112.128‘ (p
  20. python写完后打不开门_你的解锁方式为什么打不开门?

热门文章

  1. nfs-ganesha 编译选项
  2. 主数据供应商有哪些!
  3. 远超预期,英特尔Omni path架构获广泛市场认可
  4. 在Visual Studio 2012 for Web中找不到“使用母版页的Web窗体”
  5. 职场实用的软件测试能力之业务测试(小白必看)
  6. java调用序列_基于JAVA的苹果序列号接口调用代码实例
  7. 制造企业质量成本管理中的问题与对策
  8. html css实现轮播图
  9. 史上最全网络端口号大全,网络工程师必备!
  10. DBeaver clickhouse 时区不对 时间少了8小时