jstring, String, char* 变换函数

Cpp代码   收藏代码
  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);   
  62. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要将`jstring`类型的字符串转换为`char*`类型,你可以使用Java Native Interface (JNI) 提供的函数来完成。下面是一个示例代码,展示了如何将`jstring`转换为`char*`: ```cpp #include <jni.h> #include <cstring> char* jstringToChar(JNIEnv* env, jstring jstr) { const char* str = env->GetStringUTFChars(jstr, nullptr); char* result = strdup(str); env->ReleaseStringUTFChars(jstr, str); return result; } int main() { JavaVM* jvm; // 从JNI获取JavaVM实例 JNIEnv* env; // 从JavaVM获取JNIEnv实例 // 获取JNIEnv实例 jvm->AttachCurrentThread(reinterpret_cast<void**>(&env), nullptr); // 假设我们有一个jstring对象 jstring jstr = ...; // 将jstring转换为char* char* str = jstringToChar(env, jstr); // 使用转换后的char*字符串 // ... // 释放char*字符串的内存 delete[] str; // 分离线程 jvm->DetachCurrentThread(); return 0; } ``` 在这个示例中,我们定义了一个名为`jstringToChar`的函数,它接受一个`JNIEnv*`参数和一个`jstring`参数,并返回一个`char*`指针。在函数内部,我们使用`env->GetStringUTFChars(jstr, nullptr)`函数获取`jstring`对象的UTF-8格式字符串,并使用`strdup`函数创建一个新的字符串副本。然后,我们使用`env->ReleaseStringUTFChars(jstr, str)`函数释放`jstring`对象的UTF-8格式字符串。 在使用转换后的`char*`字符串时,你可以根据需要进行操作。在示例中,我们假设你已经从JNI获取了JavaVM实例和JNIEnv实例,并在主函数中使用了示例代码。 请记住,在使用完转换后的`char*`字符串后,要记得释放它的内存,以避免内存泄漏。在示例中,我们使用了`delete[] str`来释放内存,但这取决于你在分配内存时使用的方法。 请注意,这只是一个示例代码,具体实现可能会因为JNI的使用方式和上下文而有所不同。确保根据你的实际需求进行适当的修改和适配。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值