【问题标题】:How to convert QString to jstring?如何将 QString 转换为 jstring?
【发布时间】:2021-11-17 10:05:51
【问题描述】:

根据 PaulMcKenzie 的回答,我尝试使用以下代码将 QString 转换为 jstring。

jstring CreateJStringFromQString(JNIEnv *env, const QString& str)
{
    jstring js = env->NewString(reinterpret_cast<jchar *>(str.data()), str.size());
    return js;
}

但是,我有以下错误

/home/runner/work/jni/jni/hello/src/main/cpp/HelloJNIImpl.cpp:46:69: 
error: reinterpret_cast from type ‘const QChar*’ to type ‘jchar*’ 
{aka 
‘short unsigned int*’} casts away qualifiers
46 |     jstring js = env->NewString(reinterpret_cast<jchar *> 
(str.data()), str.size());
                                                                       
          ^


FAILURE: Build failed with an exception.

我试过那个答案。但是会出现上述错误。

如何将 QString 转换为 jstring ?

【问题讨论】:

    标签: c++ qt java-native-interface qstring


    【解决方案1】:

    我不使用 Qt,所以我将参考文档 here 关于 QString。

    鉴于此,您可以尝试以下方法:

    jstring CreateJStringFromQString(JNIEnv *env, const QString& str)
    {
        jclass string_class = env->FindClass("java/lang/String");
        jmethodID string_constructor = env->GetMethodID(string_class, "<init>", "(Ljava/lang/String;)V" );
        jstring js = env->NewObject(string_class, string_constructor, env->NewString(str.data(), str.size()));
        return js;
    }
    

    我在自己编写的 JNI 接口中使用了与上面类似的代码。

    没有错误检查以查看string_classstring_constructor 是否有效,但假设它们有效。

    基本上你必须构造一个 java String 对象,并用数据填充它。

    【讨论】:

    • 如果QString 遵循std::string 的移动语义,则更改为const 引用可能不会导致加速。鉴于此,基本上std::string 现在在许多代码库中通过值传递符合 C++ 11 及更高版本的代码。
    • 看起来 QString 确实有移动语义:QString(QString &amp;&amp;other) -- 所以按值传递不应该对性能造成影响。
    • NewString 用给定的内容构造了一个 Java String,所以调用 NewObject 似乎有点多余。
    • @PaulMcKenzie 我编辑了我的问题。抱歉耽搁了。
    • 如果 QChar 和 jchar 都是 16 位 int 字符(看起来确实如此),那么问题可能是 signedunsigned。如果这是演员,只需应用 reinterpret_cast&lt;jchar *&gt; 应该可以工作,即 env-&gt;NewString(reinterpret_cast&lt;jchar *&gt;(str.data()), str.size());
    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2013-05-14
    相关资源
    最近更新 更多