NDK的wchar_t居然是4个字节,搞什么啊,好吧,你把wchar_t改成4字节,那你得把对应的函数改过来吧,wcslen函数处理wchar_t字符串的结果完全不对,用NDK提供的NewStringUTF那套函数来转的话,用参数"UTF-32"来转始终是错的,把每个4字节字符缩小成2个字节再交换这两个字节,用参数"UTF-16"才能正确转化成jstring.
typedef unsigned short WCHAR;
class String_cl
: public std::basic_string<WCHAR, std::char_traits<WCHAR>, std::allocator<WCHAR> >
{
typedef std::basic_string<WCHAR, std::char_traits<WCHAR>, std::allocator<WCHAR> > __super;
public:
String_cl(){}
String_cl(const wchar_t* piString)
{
if (piString != NULL)
{
if (sizeof(wchar_t) != 4)
{
__android_log_print(ANDROID_LOG_INFO, "MainLogic", "wchar_t的大小与预想不一致");
return;
}
int iLength = GetCount(piString);
if (iLength >= 1024)
{
WCHAR* pwString = new WCHAR[iLength + 1];
for (int i = 0; i < iLength; ++i)
{
pwString[i] = piString[i];
UINT8* pucChar = (UINT8*)&pwString[i];
std::swap(pucChar[0], pucChar[1]);
}
pwString[iLength] = 0;
__super::operator=(pwString);
delete[] pwString;
}
else
{
WCHAR awString[1024] = {0};
for (int i = 0; i < iLength; ++i)
{
awString[i] = piString[i];
UINT8* pucChar = (UINT8*)&awString[i];
std::swap(pucChar[0], pucChar[1]);
}
__super::operator=(awString);
}
}
}
int GetSize() const
{
return size() * sizeof(WCHAR);
}
static int GetCount(const wchar_t* piString)
{
int iLength = 0;
while (piString[iLength] != 0)
{
++iLength;
}
return iLength;
}
};
jstring GetString(const wchar_t* pwString)
{
String_cl sInputString = pwString;
jbyteArray clStringBytes = m_pEnv->NewByteArray(sInputString.GetSize());
m_pEnv->SetByteArrayRegion(clStringBytes, 0, sInputString.GetSize(), (jbyte*)sInputString.data());
jstring sEncoding = m_pEnv->NewStringUTF("UTF-16");
jstring sString = (jstring)m_pEnv->NewObject(m_pStringClass, m_pfnStringInit, clStringBytes, sEncoding);
m_pEnv->DeleteLocalRef(sEncoding);
m_pEnv->DeleteLocalRef(clStringBytes);
return sString;
}