Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法(二)

2014-11-24 07:32:04 · 作者: · 浏览: 4
/定义一个String属性
  • public String msg = null;
  • public static void main(String[] args)throws Exception{
  • //调用动态链接库
  • System.loadLibrary(JNIDemo);
  • //从控制台中获取值
  • BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  • String str = reader.readLine();
  • JNIDemo jniDemo = new JNIDemo();
  • jniDemo.msg = str;
  • jniDemo.callCppFunction();
  • System.out.println(jniDemo.msg);
  • }
  • } 在来看一下C++代码: [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
    1. #include
    2. #includecom_jni_demo_JNIDemo.h
    3. #includewindows.h
    4. #include
    5. #include
    6. using namespace std;
    7. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_callCppFunction (JNIEnv * env, jobject obj)
    8. {
    9. //获取java中的属性:msg
    10. jfieldID fid_msg = env->GetFieldID(env->GetObjectClass(obj),msg,Ljava/lang/String;);
    11. //获取属性msg的对象
    12. jstring j_msg = (jstring)env->GetObjectField(obj,fid_msg);
    13. /**第一种方式START*/
    14. /*
    15. //获得字符串指针
    16. const jchar* jstr = env->GetStringChars(j_msg,NULL);
    17. //转换成宽字符串
    18. wstring wstr((const wchar_t*)jstr);
    19. //释放指针
    20. env->ReleaseStringChars(j_msg,jstr);
    21. */
    22. /**第一种方式END*/
    23. /**第二种方式START*/
    24. /*
    25. //获取字符串指针
    26. const jchar* jstr = env->GetStringCritical(j_msg,NULL);
    27. //转换成宽字符串
    28. wstring wstr((const wchar_t*)jstr);
    29. //释放指针
    30. env->ReleaseStringCritical(j_msg,jstr);
    31. */
    32. /**第二种方式END*/
    33. /**第三种方式START*/
    34. //获取字符串的长度
    35. jsize len = env->GetStringLength(j_msg);
    36. //生成长度为len的字符串指针
    37. jchar* jstr = new jchar[len+1];
    38. //C++中字符串以''结尾,不然会输出意想不到的字符
    39. jstr[len] = L'';
    40. //将字符串j_msg复制到jstr中
    41. env->GetStringRegion(j_msg,0,len,jstr);
    42. //转换成宽字符串
    43. wstring wstr((const wchar_t*)jstr);
    44. //释放指针
    45. delete[] jstr;
    46. /**第三种方式END*/
    47. //将字符串进行倒序
    48. reverse(wstr.begin(),wstr.end());
    49. //获取倒序后新的字符串
    50. jstring j_new_str = env->NewString((const jchar*)wstr.c_str(),(jint)wstr.size());
    51. //将新的字符串设置变量中
    52. env->SetObjectField(obj,fid_msg,j_new_str);
    53. } 这里使用了三种方式实现功能。这里要注意的是还有一个方法就是将const jchar*转换成wstring,因为reverse方法接受的参数是wstring。在Eclipse中运行结果如下:

      \

      到这里这一篇的内容就讲到着了,后面的内容更精彩!