快速业务通道

JNI中文处理问题小结 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
nt len = MultiByteToWideChar (CP_ACP, 0, rhs.c_str (), rhs.length (), buffer, slen);     if (len > 0 && len < slen)       buffer[len] = 0;     mJstr = mEnv->NewString (buffer, len);     delete [] buffer;     mChars = new char[rhs.length () + 1];     strcpy (mChars, rhs.c_str ());     mString = rhs.c_str ();     return *this;   }   // Supply operator methods for converting the JNIString to a string   // or char*, making it easy to pass JNIString arguments to functions   // that require string or char* parameters.   string & GetString() { return mString; }   operator string() { return mString; }   operator const char* () { return mString.c_str (); }   operator jstring() { return mJstr; } private:   JNIEnv* mEnv;  // The enviroment pointer for this native method.   jstring mJstr; // A copy of the jstring object that this JNIString represents   char* mChars;  // Pointer to a ANSI code page char array   string mString; // string buffer for holding the "value" of this instance (ANSI code page) };

JNI中文处理问题小结(4)

时间:2010-05-13 大卫的思维空间

后者除了将面向UTF编码改成了面向ANSI编码外,还去掉了operator =(const char* ptr)的定义,因为 operator =(const string& rhs)可以在需要的时候替代前者而无需任何额外编码。(因为按照C++规范,const reference可以自动转换,详见本人另一文章“关于 const reference 的几点说明”)

如果你愿意,给JNIString再加个JNIString(JNIEnv* env, const wstring& str)和一个operator =(const wstring& rhs)操作符重载就比较完美了,:),很简单,留给用得到的朋友自己加吧。

下面是一个使用该类的例子(真正跟用于演示的code很少,大部分都是些routine code,:)):

#include <iostream> #include <string> #include <assert.h> #include <jni.h> using namespace std; int main() {   int res;   JavaVM* jvm;   JNIEnv* env;   JavaVMInitArgs vm_args;   JavaVMOption options[3];   options[0].optionString = "-Djava.compiler=NONE";   options[1].optionString = "-Djava.class.path=.;.."; // .. is specially for this project   options[2].optionString = "-verbose:jni";   vm_args.version = JNI_VERSION_1_4;   vm_args.nOptions = 3;   vm_args.options = options;   vm_args.ignoreUnrecognized = JNI_TRUE;   res = JNI_CreateJavaVM (& jvm, (void* * )& env, & vm_args);   if (res < 0) {     fprintf (stderr, "Can''''t create Java VM\n");     return 1;   }   jclass cls = env->FindClass ("jni/test/Demo");   assert (0 != cls);   jmethodID mid = env->GetMethodID (cls, "", "(Ljava/lang/String;)V");   assert (0 != mid);   wchar_t* p = L"中国";   jobject obj = env->NewObject (cls, mid, env->NewString (reinterpret_cast (p), wcslen (p)));   assert (0 != obj);   mid = env->GetMethodID (cls, "getMessage", "()Ljava/lang/String;");   assert (0 != mid);   jstring str = (j

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号