不能从'const jchar *'转换为'const wchar_t *' [英] cannot convert from 'const jchar *' to 'const wchar_t *'

查看:272
本文介绍了不能从'const jchar *'转换为'const wchar_t *'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是从.cpp文件抛出的错误。我使用visual studio 10和windows7 32位和从eclipse indigo编译

  AUWideString(JNIEnv * jni,jstring jstr)
:mJni(jni),
mJString(jstr),
mString(0)
{
if (jstr!= 0){
mString = jni-> GetStringChars(jstr,0);
}
}

〜AUWideString()
{
mJni-> ReleaseStringChars(mJString,mString);
}

操作符const wchar_t *()const
{
return mString;
}
**错误C2440:'=':无法从'const jchar *'转换为'const wchar_t *'
指向的类型是不相关的;转换需要reinterpret_cast,C风格的转换或函数式转换
错误C2664:'JNIEnv _ :: ReleaseStringChars':无法将参数2从'const wchar_t *'转换为'const jchar *'**** $ b $

c>无符号短 c>,而不是 wchar_t code>。但是,在Windows上,两者都是16位大小,所以你可以在需要时使用类型转换,如第一个编译器错误所说。您还应将 mString 定义为 jchar * ,而不是 wchar_t * 因为这是JNI实际工作。

  

class AUWideString
{
private:
JNIEnv * mJni;
jstring mJString;
jchar * mString;
...

public:
AUWideString(JNIEnv * jni,jstring jstr)
:mJni(jni),
mJString(jstr),
mString(0)
{
if(mJString!= 0)
mString = mJni-> GetStringChars(mJString,0);
}

〜AUWideString()
{
if((mJString!= 0)&(mString!= 0))
mJni - > ReleaseStringChars(mJString,mString);
}

operator const wchar_t *()const
{
return reinterpret_cast< const wchar_t *>(mString);
}
};


This is an error getting thrown from .cpp file.I am using visual studio 10 and windows7 32 bit and am compiling from eclipse indigo

AUWideString(JNIEnv* jni, jstring jstr)
    : mJni(jni),
      mJString(jstr),
      mString(0)
    {
        if (jstr != 0) {
            mString = jni->GetStringChars(jstr, 0);
        }
    }

    ~AUWideString()
    {
        mJni->ReleaseStringChars(mJString, mString);
    }

    operator const wchar_t*() const
    {
        return mString;
    }
    **error C2440: '=' : cannot convert from 'const jchar *' to 'const wchar_t *'
            Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    error C2664: 'JNIEnv_::ReleaseStringChars' : cannot convert parameter 2 from 'const wchar_t *' to 'const jchar *'****

how should this be resolved?

解决方案

jchar is defined as unsigned short, not wchar_t. However, on Windows, both are 16-bit in size, so you can use a type-cast when needed, as the first compiler error says. You should also be defining mString as a jchar* instead of a wchar_t* since that is what JNI actually works with. That would eliminate the second error message.

Try this:

class AUWideString
{
private:
    JNIEnv* mJni;
    jstring mJString;
    jchar* mString;
    ...

public:
    AUWideString(JNIEnv* jni, jstring jstr)
        : mJni(jni),
          mJString(jstr),
          mString(0)
    {
        if (mJString != 0)
            mString = mJni->GetStringChars(mJString, 0);
    }

    ~AUWideString()
    {
        if ((mJString != 0) && (mString != 0))
            mJni->ReleaseStringChars(mJString, mString);
    }

    operator const wchar_t*() const
    {
        return reinterpret_cast<const wchar_t*>(mString);
    }
};

这篇关于不能从'const jchar *'转换为'const wchar_t *'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆