【问题标题】:A value of type "System::String ^" cannot be used to initialize an entity of type "jstring"“System::String ^”类型的值不能用于初始化“jstring”类型的实体
【发布时间】:2015-06-11 16:04:13
【问题描述】:

正如标题所说,这是我在运行这段代码时遇到的错误,它是用 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 接受函数 something。是否有一种转换方法可以与函数一起使用,使其成为 jstring 可接受的类型?

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    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 专家,也没有在编译器中检查我的语法。

    【讨论】:

    • env->NewString() 是否也适用于函数?如果是这样,你能用我的例子写一个例子来说明我是如何进行转换的吗?问题是something 正在从 dll 文件中调用一个方法,而该方法只能作为String^ 引用。请再次向我展示转换的代码。谢谢。
    • 查看编辑。您需要先将String^转换为wchar_t*,然后使用NewString转换为jstring。
    • 您可以使用marshal_context 代替StringToHGlobalUni 进行此转换。见my answer here。或者您可以使用 PtrToStringChars 并完全避免复制。
    • 从String^ 转换为wchar_t* 的方法有很多种,StackOverflow 上的许多问题都回答了这些问题。 (多样性是我最初回答这个问题时没有具体代码的原因。)
    • 感谢和抱歉迟到的回复。我在Marshal::StringToHGlobalUni 处收到错误消息““void *”类型的值不能用于初始化“wchar_t *”类型的实体,老实说,我不知道它在哪里读取 void。
    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多