You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:27:03