【发布时间】: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->NewObjectArray(app.size(),env->FindClass("java/lang/String"), 0);所做的那样是一个真的坏主意。您不会在此过程中检查任何返回值。 JNI 是非常脆弱的 - 一件小事出错 - 例如你错过了一个未决的异常 - 事情可能会工作一段时间,或者他们可能会立即崩溃。当你像这样链接调用时,你将不能够找出哪个失败了。每行一个调用,检查所有返回值是否有错误和未决异常。 每个调用。
标签: java c++ arrays string java-native-interface