Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java jni时转换字符串类型 我尝试调用java应用程序中的C++代码,这是通过C++库完成的。所以基本上我最终得到了03种不同类型的字符串: jstring(来自JavaJNI) 字符串^(来自C#) char*(来自C++)_Java_C#_C++_Java Native Interface - Fatal编程技术网

使用java jni时转换字符串类型 我尝试调用java应用程序中的C++代码,这是通过C++库完成的。所以基本上我最终得到了03种不同类型的字符串: jstring(来自JavaJNI) 字符串^(来自C#) char*(来自C++)

使用java jni时转换字符串类型 我尝试调用java应用程序中的C++代码,这是通过C++库完成的。所以基本上我最终得到了03种不同类型的字符串: jstring(来自JavaJNI) 字符串^(来自C#) char*(来自C++),java,c#,c++,java-native-interface,Java,C#,C++,Java Native Interface,问题是我必须在他们中间转换。因此,我的转换代码是: 从C++到C<< /p> 但我在尝试执行应用程序时出错。当我禁用toString方法时,程序正常运行。有人能告诉我我用那种方法做错了什么吗? 我在谷歌上搜索了从String^到jstring的转换,但我找不到任何解决方案。。你能给我一些建议吗? 非常感谢。我不知道你错在哪里。至少您缺少免费的。但我不会通过char*进行修改,当然也不会修改UTF-8(通过GetStringUTFChars) Windows上的.NET System::Strin

问题是我必须在他们中间转换。因此,我的转换代码是: 从C++到C<< /p> 但我在尝试执行应用程序时出错。当我禁用toString方法时,程序正常运行。有人能告诉我我用那种方法做错了什么吗?
我在谷歌上搜索了从String^到jstring的转换,但我找不到任何解决方案。。你能给我一些建议吗?

非常感谢。

我不知道你错在哪里。至少您缺少免费的
。但我不会通过
char*
进行修改,当然也不会修改UTF-8(通过GetStringUTFChars)

Windows上的.NET System::String和Java System.String都是以代码单位计数的UTF-16LE编码的Unicode字符序列

#包括

jstring CopyDotNetString(JNIEnv*env,System::String^value)
{
if(value==nullptr)返回0;
常量自动编码单位计数=值->长度;
/*.NET系统::查尔,C++ STD::WCHARIGT,JNI JCHAR和java char
都是同样大小的,并持有一个UTF-16LE代码单元*/
const pin_ptr buffer=PtrToStringChars(值);
返回环境->新闻字符串(
重新解释(缓冲区),
编码单位计数);
}
System::String^GetStringFromJava(JNIEnv*env,jstring值)
{
如果(值==0),则返回nullptr;
const auto codeunitCount=env->GetStringLength(值);
const auto buffer=env->GetStringChars(值,NULL);
试一试{
返回新系统::字符串(
重新解释(缓冲区),
0, 
编码单位计数);
}
最后{
环境->释放字符串字符(值,缓冲区);
}
}

请提供您遇到的错误
String^ toStringCS(const char *chars){
    int len = (int)strlen(chars);
    array<unsigned char>^ a = gcnew array<unsigned char>(len);
    int i = 0;
    while(i<len){
        a[i] = chars[i];
        i++;
    }
    return Encoding::UTF8->GetString(a);
}
char* toStringCPP(String^ P){
   pin_ptr<const wchar_t> wch = PtrToStringChars(P);
   printf_s("%S\n", wch);
   size_t convertedChars = 0;
   size_t  sizeInBytes = ((P->Length + 1) * 2);
   errno_t err = 0;
   char *ch = (char *)malloc(sizeInBytes);
   return ch;
}
jboolean isCopyS1;
const char *c_S1 = env->GetStringUTFChars(s1, &isCopyS1);
jstring CopyDotNetString(JNIEnv *env, System::String^ value)
{
    if (value == nullptr) return 0;

    const auto codeunitCount = value->Length;
    /* .NET System::Char, C++ std::wchar_t, JNI jchar, and Java char are 
        all the same size and hold a UTF-16LE code unit. */
    const pin_ptr<const wchar_t> buffer = PtrToStringChars(value); 
    return env->NewString(
        reinterpret_cast<const jchar*>(buffer),
        codeunitCount);
}

System::String^ GetStringFromJava(JNIEnv *env, jstring value)
{
    if (value == 0) return nullptr;

    const auto codeunitCount = env->GetStringLength(value);
    const auto buffer = env->GetStringChars(value, NULL);
    try {
        return gcnew System::String(
           reinterpret_cast<const wchar_t*>(buffer), 
           0, 
           codeunitCount);
    }
    finally {
        env->ReleaseStringChars(value, buffer);
    }
}