类型为" System :: String ^"不能用于初始化类型" jstring"的实体。

时间:2015-06-11 16:04:13

标签: string java-native-interface c++-cli

因为标题说明了我在运行此代码时遇到的错误,这是用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的可接受类型?

提前致谢。

1 个答案:

答案 0 :(得分:0)

方法env->NewString()将采用Unicode缓冲区并返回jstring。您需要从String^转换为wchar_t*,然后将其传递给env->NewString()。 (或env->NewStringUTF()转换UTF8编码的char*,这也适用于任何ASCII char*。)

但是,如果需要创建一个jstring,那么可以修改somethig直接返回jstring,还是修改输入char*?如果没有看到somethig如何实施,那么通过String^旅行似乎是不必要的。

修改

这是您要使用的转换代码。同样,如果您可以修改something,那么有更好的解决方案。

您需要使用StringToHGlobalUniString^转换为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专家,也没有在编译器中检查我的语法。