Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NewString()&;NewStringUTF()显示错误无效修改的UTF-8: 我试图通过Android中的JNI将代码> char */COD>从C++传递到java。 我尝试了很多方法来传递数据_Java_Android_Java Native Interface - Fatal编程技术网

NewString()&;NewStringUTF()显示错误无效修改的UTF-8: 我试图通过Android中的JNI将代码> char */COD>从C++传递到java。 我尝试了很多方法来传递数据

NewString()&;NewStringUTF()显示错误无效修改的UTF-8: 我试图通过Android中的JNI将代码> char */COD>从C++传递到java。 我尝试了很多方法来传递数据,java,android,java-native-interface,Java,Android,Java Native Interface,1) 使用NewStringUTF: const char* data = getData(); // this method returns a char array. env->NewStringUTF(data); 执行上面的代码会抛出下面的错误 JNI WARNING: input is not valid Modified UTF-8: illegal continuation byte 0x70. 2) 使用NewString: const char* data = get

1) 使用
NewStringUTF

const char* data = getData(); // this method returns a char array.
env->NewStringUTF(data);
执行上面的代码会抛出下面的错误

JNI WARNING: input is not valid Modified UTF-8: illegal continuation byte 0x70.
2) 使用
NewString

const char* data = getData(); // this method returns a char array.
// passing a byte array to java
jbyteArray trackIDArray = env->NewByteArray(strlen(data));
env->SetByteArrayRegion(trackIDArray, 0, strlen(data), (const jbyte*)trackID);
在java方面,我得到了一些垃圾值。我不明白如何将这个
char
数组转换成Java。

1)您的
数据根本不是有效的UTF-8字符串。并非每个字符数组都自动成为有效的UTF-8。您可能有一些单字节编码(如ISO或Windows CP),或者根本不是可读字符串

2) 应该可以,但显示从
数据中填充
trackID
的代码。您需要将其硬输入到
jbyte*
的事实是可疑的这段代码可能是正确的,但您也可能在Java方面犯错误:


如果
数据
不是可读字符串或采用非“平台默认字符集”的单字节编码,则无法从中生成可读字符串!在这种情况下,您必须在C端转换为UTF-8。您还将摆脱对平台特定编码的依赖(这可能会有很大的不同)。

我怀疑
数据
而不是
trackID

env->SetByteArrayRegion(trackIDArray, 0, strlen(data), (const jbyte*)data);
然后您就有了字节,在java端可以通过十六进制转储或其他检查查看它是什么编码

后来:

String s = new String(data, "Cp1252"); // Or so.

NewStringUTF希望您传递一个修改的UTF-8字符串。 您可能正试图通过UTF-8考试

有多种方法可以解决此问题: 最明显的一个是将字符串编码为C++中修改的UTF-8,然后将其传递给java。 另一种方法是将其作为字节数组传递给Java,并使用字符串构造函数将其从UTF-16转换过来

第二种方法可能更有效,因为最终Java使用UTF-16表示字符串


< P>作为一种替代方法,您可以将字符串转换成C++中的UTF 16,并将其传递给期望UTF 16的NetryJNI函数。

< P>我在JNI后面放置了非常大的字节(>2KByter):

csv表的内容:

R"xxx(tbl_Cbla,Column 02,Column 03,Column 04
sdfsdsad,sdfasd,dsfaddf,fdsasdf,fafasa
18,1,10,8,0)xxx"`
处理缓冲读取器也取决于您,小示例:

Strig line = buffer.readLine(); 
while ((line = buffer.readLine()) != null) {
 //play around with 'line'
}

如何在C端将char*转换为utf-8。请帮助我,这取决于你在C端的编码。然后谷歌“C转换utf-8”。对于任何编码,都没有简单且单一的通用解决方案。还可以看看@Joop-answer,它基本上是选项2),在Java端显式地告诉编码。非常正确,这也是我要求OP填写代码
trackID
的原因。
ByteArrayInputStream bis = null;
try {

   bis = new ByteArrayInputStream(rawResource(1);
} catch (Exception e) {
   e.printStackTrace();
}
BufferedReader buffer = new BufferedReader(new InputStreamReader(bis,   Charset.forName("UTF-8")));
Strig line = buffer.readLine(); 
while ((line = buffer.readLine()) != null) {
 //play around with 'line'
}