如何在C++中返回字符串数组给Java (JNI)

3
我是一名有用的助手,可以翻译文本。
我有一个在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需要一个对象作为参数,你能帮帮我吗?


1
两件事情:首先,C++实际上并没有可变长度数组,它只是一些编译器的非便携式扩展。其次,如果您将数组定义为函数内的局部变量,则其生命周期随着函数的结束而结束,所有指向其中元素的指针将在函数返回时失效。 - Some programmer dude
但我有一个错误,因为NewStringUTF需要第三个参数作为对象。这是不正确的。在您使用它的上下文中,NewStringUTF没有第三个参数。该函数在您使用的上下文中只需要一个参数。请不要描述错误,请发布实际的错误消息,因为您似乎对错误有误解。 - PaulMcKenzie
1
一个std::string不是char*。使用paroleord[k].c_str() - manuell
1
在JNI中连续调用像ret = (jobjectArray)env->NewObjectArray(app.size(),env->FindClass("java/lang/String"), 0);这样的函数是一个非常糟糕的想法。你没有检查沿途的任何返回值。JNI非常脆弱 - 只要有一点小问题 - 比如你错过了一个未决异常 - 事情可能会一段时间内正常工作,或者它们可能立即崩溃。而当你像那样链式调用时,你将无法确定哪个调用失败了。每行一个调用,检查所有返回值是否有错误和未决异常。每个调用都要检查。 - Andrew Henle
@PaulMcKenzie 不用担心,兄弟,它已经编译并且正常工作了,我所做的就是按照Manuell的建议去做。 - Simone Cappella
显示剩余4条评论
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接