因为标题说明了我在运行此代码时遇到的错误,这是用C ++ / CLI编写的:
String^ somethig(const char* string)
{
// Some code
}
JNIEXPORT jstring JNICALL Java_Class_nativeClass
(JNIEnv * env, jobject jobj,jstring string)
{
jboolean isCopyString;
const char *c_string = env->GetStringUTFChars(string, &isCopyString);
jstring example = somethig(c_string);
return example;
}
我在线收到错误:
jstring example = something(c_string);
特别是在 示例 。现在我知道错误意味着什么,我只是不知道如何让jstring接受函数 某些东西 。是否有一个转换方法可以使用函数使其成为jstring的可接受类型?
提前致谢。
答案 0 :(得分:0)
方法env->NewString()
将采用Unicode缓冲区并返回jstring。您需要从String^
转换为wchar_t*
,然后将其传递给env->NewString()
。 (或env->NewStringUTF()
转换UTF8编码的char*
,这也适用于任何ASCII char*
。)
但是,如果需要创建一个jstring,那么可以修改somethig
直接返回jstring,还是修改输入char*
?如果没有看到somethig
如何实施,那么通过String^
旅行似乎是不必要的。
这是您要使用的转换代码。同样,如果您可以修改something
,那么有更好的解决方案。
您需要使用StringToHGlobalUni
将String^
转换为wchar_t
,然后使用NewString
将其转换为jstring
。别忘了,您必须使用FreeHGlobal
释放wchar_t*
。
String^ managedString = something(...);
wchar_t* unmanagedWideString = Marshal::StringToHGlobalUni(managedString).ToPointer();
jstring example = env->NewString(unmanagedWideString, managedString->Length);
Marshal::FreeHGlobal(unmanagedWideString);
return example;
免责声明:我不是JNI专家,也没有在编译器中检查我的语法。