C++中如何将JSTRING转换为普通std::string类型字符串
C++ 中 JSTRING 转换为 std::string 的实现方案
以下实现默认你提到的
JSTRING为JNI(Java Native Interface)中定义的jstring类型,这是C/C++与Java交互时常用的Java字符串对接类型。如果是其他自定义的JSTRING类型,可以参考逻辑调整取值接口即可。
完整实现代码
#include <jni.h> #include <string> std::string jstringToStdString(JNIEnv* env, jstring jStr) { // 空指针校验 if (jStr == nullptr) { return ""; } // 从jstring获取UTF-8编码的C风格字符串指针 const char* cStrBuffer = env->GetStringUTFChars(jStr, nullptr); // 构造std::string std::string result(cStrBuffer); // 释放JNI层申请的内存,避免泄漏 env->ReleaseStringUTFChars(jStr, cStrBuffer); return result; }
核心逻辑说明
- 首先做指针合法性校验,避免传入空的
jstring导致后续调用崩溃 - 调用
JNIEnv提供的GetStringUTFChars接口,获取JNI层返回的jstring对应的UTF-8字符数组指针,第二个参数传nullptr表示不需要确认是否为拷贝副本 - 直接用C风格字符数组构造
std::string,内容会自动拷贝到std::string的内存空间中 - 必须调用
ReleaseStringUTFChars释放GetStringUTFChars申请的内存,否则会产生JNI层内存泄漏,长时间运行会导致进程内存溢出
特殊场景说明
- 如果你需要非UTF-8编码的
std::string,可以在拿到C风格字符串后,额外做编码转换即可 - 如果在非Java发起调用的原生线程中执行转换,需要先确保当前线程已经绑定了JNI环境,拿到的
JNIEnv指针是当前线程有效的指针,否则会触发崩溃 - 如果你的JSTRING是其他业务框架自定义的字符串类型,只需要替换获取C风格字符数组的逻辑,后续构造
std::string的逻辑完全通用
内容的提问来源于stack exchange,提问作者John wick
相关产品推荐
相关产品推荐

