无法从'const jchar *'转换为'const wchar_t *'

时间:2012-12-18 04:59:03

标签: c++ visual-studio-2010 java-native-interface

这是从.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);
    }

    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 *'****

应如何解决?

1 个答案:

答案 0 :(得分:2)

jchar定义为unsigned short,而不是wchar_t。但是,在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);
    }
};