在使用Jni的JNIEnv->NewStringUTF的时候抛出了异常"JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xfe "。网上搜索了一下,这个异常是由于Java虚拟机内部的dalvik/vm/CheckJni.c中的checkUtfString函数抛出的,并且JVM的这个接口明确是不支持四个字节的UTF8字符。因此需要在调用函数之前,对接口传入的字符串进行过滤,过滤函数如下:

checkUtfString
C++
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
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
52
)
{
;
{
;
}
{
;
// Switch on the high four bits.
{
:
:
:
:
:
:
:
{
// Bit pattern 0xxx. No need for any extra bytes.
;
}
:
:
:
:
{
;
}
{
// Bit pattern 1110, so there are two additional bytes.
;
{
;
}
// Fall through to take care of the final byte.
}
:
{
// Bit pattern 110x, so there is one additional byte.
;
{
;
}
;
}
}
}
;
}

参考链接 android jni中 utf-8的check

发布者

 

默默

默默码农 查看所有由默默发布的文章

 

 

#########################################################################################################

newStringUTF出现input is not valid Modified UTF-8错误解决办法

2013年10月12日 ⁄ 综合 ⁄ 共 883字 ⁄ 字号 ⁄ 评论关闭
 

JNI调用newStringUTF时遇到不认识的字符串就直接出错退出~~,网上原因是dalvik/vm/CheckJni.c里面的checkUtfString函数检查通不过.找了半天没找到修正办法,把这个函数改了下,当做一个修正函数,下面是代码

 

void correctUtfBytes(char* bytes) {
  char three = 0;
   while (*bytes != '\0') {
	   unsigned char utf8 = *(bytes++);
	   three = 0;
	   // Switch on the high four bits.
	   switch (utf8 >> 4) {
	   case 0x00:
	   case 0x01:
	   case 0x02:
	   case 0x03:
	   case 0x04:
	   case 0x05:
	   case 0x06:
	   case 0x07:
		   // Bit pattern 0xxx. No need for any extra bytes.
		   break;
	   case 0x08:
	   case 0x09:
	   case 0x0a:
	   case 0x0b:
	   case 0x0f:
		   /*
			* Bit pattern 10xx or 1111, which are illegal start bytes.
			* Note: 1111 is valid for normal UTF-8, but not the
			* modified UTF-8 used here.
			*/
		   *(bytes-1) = '?';
		   break;
	   case 0x0e:
		   // Bit pattern 1110, so there are two additional bytes.
		   utf8 = *(bytes++);
		   if ((utf8 & 0xc0) != 0x80) {
			   --bytes;
			   *(bytes-1) = '?';
			   break;
		   }
		   three = 1;
		   // Fall through to take care of the final byte.
	   case 0x0c:
	   case 0x0d:
		   // Bit pattern 110x, so there is one additional byte.
		   utf8 = *(bytes++);
		   if ((utf8 & 0xc0) != 0x80) {
			   --bytes;
			   if(three)--bytes;
			   *(bytes-1)='?';
		   }
		   break;
	   }
   }
}

http://www.xuebuyuan.com/1240531.html
http://www.mobibrw.com/2016/2859

相关文章:

  • 2021-08-08
  • 2022-12-23
  • 2021-07-26
  • 2021-06-07
  • 2022-12-23
  • 2021-11-19
  • 2021-09-23
  • 2022-02-08
猜你喜欢
  • 2021-05-07
  • 2022-12-23
  • 2021-11-05
  • 2022-12-23
  • 2022-12-23
  • 2021-12-14
相关资源
相似解决方案