【问题标题】:How to return String Array from C++ to Java (JNI)如何将字符串数组从 C++ 返回到 Java (JNI)
【发布时间】:2019-11-28 07:54:02
【问题描述】:

我在 c++ 上有一个字符串数组,我需要将它返回给 Java 类。 我怎样才能做到这一点?

我试过这个:

string paroleord[app.size()];
jobjectArray ret;
ret = (jobjectArray)env->NewObjectArray(app.size(),env->FindClass("java/lang/String"), 0);
for (int k = 0; k < app.size(); k++)
{
    env->SetObjectArrayElement(ret, k,env->NewStringUTF(paroleord[k]));
}

return ret;

但是我有一个错误,因为 NewStringUTF 需要一个对象作为参数,你能帮我吗?

【问题讨论】:

  • 两件事:首先,C++ 并没有真正的variable-length arrays,它是一些编译器的不可移植扩展。其次,如果将数组定义为函数内部的局部变量,它的生命周期会随着函数而结束,一旦函数返回,所有指向其中元素的指针都会失效。
  • 但我有一个错误,因为 NewStringUTF 需要一个对象作为第三个参数——这不是真的。 NewStringUTF 没有第三个参数。 NewStringUTF 函数在您使用它的上下文中采用一个参数。请发布实际的错误消息,而不是描述错误,因为您似乎误认为错误。
  • 是的,你是对的,我的意思是参数。
  • std::string 不是 char*。使用paroleord[k].c_str()
  • 在 JNI 中调用一个又一个的链接,就像你对 ret = (jobjectArray)env-&gt;NewObjectArray(app.size(),env-&gt;FindClass("java/lang/String"), 0); 所做的那样是一个真的坏主意。您不会在此过程中检查任何返回值。 JNI 是非常脆弱的 - 一件小事出错 - 例如你错过了一个未决的异常 - 事情可能会工作一段时间,或者他们可能会立即崩溃。当你像这样链接调用时,你将能够找出哪个失败了。每行一个调用,检查所有返回值是否有错误和未决异常。 每个调用。

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


【解决方案1】:

如果您可以使用 VectorArray 生存,您可以简单地从 C++ 代码返回集合。

这将需要一些“低级”编码,但它相当简单。

看这里:

http://jnicookbook.owsiak.org/recipe-no-045/

至于字符串本身,请看这里:

http://jnicookbook.owsiak.org/recipe-No-010/

另外,确保将string 转换为字符数组。

(*env)->NewStringUTF(env, my_string.c_str());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-30
    • 2010-12-09
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多