我尝试从java应用程序调用C#代码,这是通过C ++库完成的。所以基本上我最终使用03种不同类型的字符串:
问题是我必须在它们之间进行转换。所以我的转换代码是:
从C ++到C#
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);
}
从C#到C ++
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;
}
从jstring到C ++
jboolean isCopyS1;
const char *c_S1 = env->GetStringUTFChars(s1, &isCopyS1);
但是在尝试执行应用程序时遇到错误。当我禁用toStringCS方法时,程序正常运行。有人能告诉我在那种方法中我做错了什么吗?
我用Google搜索从String ^转换为jstring但是我找不到任何解决方案..你能建议我一些方法吗?
非常感谢你。
答案 0 :(得分:2)
我不确定你哪里出错了。你至少缺少free
。但我不会通过char *
,当然也不会修改 UTF-8(通过GetStringUTFChars)。
Windows上的.NET System :: String和Java System.String都是代码单元计数的,UTF-16LE编码的Unicode字符序列。
#include <vcclr.h>
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);
}
}