zap*_*lom 5 c++ java android android-ndk
我正在尝试为现有的C ++代码创建Java接口。我的功能之一与此相似:
JNIEXPORT jstring JNICALL Java_com_testproxy_NativeInterface_serialize
(JNIEnv* env, jobject obj, along op)
{
return env -> NewStringUTF(<somestdstring>.c_str());
}
Run Code Online (Sandbox Code Playgroud)
问题在于,在某些情况下,第一个元素为'\ 0',因此,返回值是一个空字符串。那么是否有一些将char *转换为jstring的函数,该函数也将字符串的长度作为参数?
如果您的字符串(无论是 c 风格字符串还是 std:: string 或 std::wstring)包含零作为第一个字符,则意味着它以 null 结尾,并且该字符串的内容是空字符串。
值得注意的是,我们用于字符串的容器依赖于最后一个元素(终止字符串)为零这一事实。
如果我们手动设法将 null 终止零更改为另一个值(可打印与否并不重要),我们的代码将面临很多危险。如果对非空终止字符串调用简单的 strlen,它将读取连续内存,直到找到零(但它不再表示字符串的长度)。考虑到这种情况,您可以想象,违反该规则很可能会损害应用程序的其余部分。
其原因有点残酷,但很简单;看看strlen 的这个实现:
std::size_t strlen(const char* start) {
const char* end = start;
while(*end++ != 0);
return end - start - 1;
}
Run Code Online (Sandbox Code Playgroud)
因此,*end仅当遇到零时才会停止,但由于我们假设它将被删除,因此我们最终将读取内存的其他部分,从而在长度计算中犯下明显的错误。
回到你的案例
在您的情况下可能发生这种情况的原因是一个错误,该错误在字符串的第一个位置插入了零,或者该字符串只是空的,或者 - 更有趣的是 - 您正在某处传递一个字符串,然后返回一个新的空字符串而不是你想要的字符串。
这个问题与 UTF8 几乎没有关系,因为使用 UTF8 您可能会遇到的是字形中字符串的长度比存储字符串本身所需的字节数短。
使用 UTF8 时,您需要注意字节数等于字形数(适用于 ASCII)的假设不再有效,因为要打印 0-127 范围之外的内容,您可能需要额外的字节。
您所展示的情况不是 UTF 的责任。
我建议首先调查这些字符串在 C++ 端为空的原因。
| 归档时间: |
|
| 查看次数: |
2382 次 |
| 最近记录: |