【问题标题】:how to convert typedef basic_string<char> string to byte array in cpp如何在 cpp 中将 typedef basic_string<char> 字符串转换为字节数组
【发布时间】:2017-07-06 12:03:35
【问题描述】:

我正在尝试使用 JNI 将 cpp 字符串传递给 java android。

void Endpoint::utilLogWrite(int prmLevel,
                const string &prmSender,
                const string &prmMsg)

所以当我使用 JNI 从 java 读取 prmMsg 时,我得到了异常。 将该 cpp 字符串转换为 java 字符串时发生以下异常。

JNI 检测到应用程序错误

我无法控制 JNIMethods.so 搜索 stackoverflow 告诉而不是发送 cpp 字符串更喜欢发送字节数组。

变量 prmMsg 的类型是 typedef basic_string 那么如何将此typedef basic_string字符串转换为字节数组。在java中我们有简单的方法

String.toBytes()

。但是在 CPP 中,我该如何实现呢。

【问题讨论】:

  • 出现什么异常?你是如何传递字符串的?
  • “发送”是什么意思?你的意思是函数调用吗?
  • @NathanOliver JNI 在应用程序中检测到错误:输入无效修改的 UTF-8:非法起始字节这是发生的异常
  • @user2079303 不,我已经有一个使用字符串参数的函数,而不是字符串参数,我喜欢将字节数组作为参数
  • 目前尚不清楚您正在做什么来获取异常,也不清楚您建议更改什么代码,也不清楚您所说的字节数组是什么意思。您似乎被 3rd-party 代码中的错误阻止:它无法处理 UTF-8 使用 4 个代码单元编码的字符,因为它不恰当地使用需要修改的 UTF-8 编码的 JNI 函数。

标签: c++ arrays string java-native-interface


【解决方案1】:

“输入无效修改的 UTF-8:非法起始字节”:是的,UTF-8 与修改的 UTF-8 不同,后者是 JNI 提供的拐杖 [并且,在某些地方(类路径和成员名称等),要求]。所以,我喜欢你使用 Java 进行任何字符编码转换的方法。

要创建字节数组,请调用NewByteArray。要填写它,请致电SetByteArrayRegion。要从 std::string 中获取 jbytes,请调用 data 并进行转换。

std::string s = "\xF0\x9F\x9A\xB2";

// jbyte and char are the same size
const auto output = env->NewByteArray(s.length());
env->SetByteArrayRegion(output, 0, s.length(), reinterpret_cast<const jbyte *>(s.data()));
return output; // return or release output

【讨论】:

  • 我无法控制该 JNI 部分,因为它是第三方组件。他们有一个执行 JNI 部分的脚本。所以我喜欢从 CPP 端发送字节,而不是将字符串传递给 JNI。
  • Java String.toBytes 是 Java byte[] 类型,在 JNI 中是 jbytearray 类型。这个答案显示了如何从 std::string 复制到新的 jbytearray。你需要使用 JNI 方法来做到这一点。
猜你喜欢
  • 2020-04-23
  • 2013-07-11
  • 2021-12-24
  • 2012-05-16
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2011-10-04
相关资源
最近更新 更多