使用Android的NDK的wchar_t

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;
         }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值