jstring, String, char* 变换函数

半腔热情 提交于 2020-03-16 04:12:21
  1. #include <malloc.h>  
  2. #include <string.h>  
  3. #include <stdlib.h>  
  4. #include <vcclr.h>  
  5.   
  6. using namespace System;  
  7. using namespace System::Text;  
  8.   
  9. // jstring To String  
  10. String^ jstringToStr(JNIEnv* env, jstring jstr)  
  11. {  
  12.     char* str = jstringTostring(env, jstr);  
  13.     String^ value = gcnew String(str);  
  14.     free(str);  
  15.     return value;  
  16. }  
  17.   
  18. // jstring To char*  
  19. char* jstringTostring(JNIEnv* env, jstring jstr)  
  20. {  
  21.     char* rtn = NULL;  
  22.     jclass clsstring = env->FindClass("java/lang/String");  
  23.     jstring strencode = env->NewStringUTF("utf-8");  
  24.     jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");  
  25.     jbyteArray barr = (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);  
  26.     jsize alen = env->GetArrayLength(barr);  
  27.     jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);  
  28.     if (alen > 0)  
  29.     {  
  30.         rtn = (char*)malloc(alen + 1);  
  31.         memcpy(rtn, ba, alen);  
  32.         rtn[alen] = 0;  
  33.     }  
  34.     env->ReleaseByteArrayElements(barr, ba, 0);  
  35.     return rtn;  
  36. }  
  37.   
  38. // String To jstring  
  39. jstring strTojstring(JNIEnv* env, String^ rtn)  
  40. {  
  41.     pin_ptr<const wchar_t> wch = PtrToStringChars(rtn);  
  42.     size_t convertedChars = 0;  
  43.     size_t sizeInBytes = ((rtn->Length + 1) * 2);  
  44.     char *ch = (char *)malloc(sizeInBytes);  
  45.     errno_t err = wcstombs_s(&convertedChars,   
  46.         ch, sizeInBytes,  
  47.         wch, sizeInBytes);  
  48.     jstring js = stringTojstring(env, ch);  
  49.     free(ch);  
  50.     return js;  
  51. }  
  52.   
  53. // char* To jstring  
  54. jstring stringTojstring(JNIEnv* env, const char* pat)  
  55. {   
  56.     jclass strClass = env->FindClass("Ljava/lang/String;");   
  57.     jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");   
  58.     jbyteArray bytes = env->NewByteArray(strlen(pat));   
  59.     env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);   
  60.     jstring encoding = env->NewStringUTF("utf-8");   
  61.     return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);   
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!