我需要从 C++ 获取一个字符串列表(char*),并将其返回给 Java。
我该怎么做?
我认为一种解决方案是返回一个预定义的大字符串,类似于 "[item1] [item2]",然后在 Java 上进行分割,但这似乎不是正确的方法。
我需要从 C++ 获取一个字符串列表(char*),并将其返回给 Java。
我该怎么做?
我认为一种解决方案是返回一个预定义的大字符串,类似于 "[item1] [item2]",然后在 Java 上进行分割,但这似乎不是正确的方法。
请查看JNI文档中的NewObjectArray
。
基本上,您可以从JNI函数返回一个字符串数组(Java),然后将其转换为List
或任何其他类型的集合。
伪代码:
Java:
....
public List<String> getFooAsList(){
return new ArrayList(this.getData());
}
private native String[] getData();
JNI
#include <jni.h>
JNIEXPORT jobjectArray JNICALL
como_foo_bar_getData
(JNIEnv *env, jobject jobj){
jobjectArray ret;
int i;
char *data[5]= {"A", "B", "C", "D", "E"};
ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));
for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i]));
return(ret);
}
未经测试!!!
如果可以,请告诉我。
谢谢!
ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));
我认为初始元素被初始化为空字符串""。
env->NewStringUTF("")
不需要,因为你在之后给数组元素分配了一个新值:
for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i]));
int i = 0;
i = 1;
或者更糟糕的是:
Object object = new BigObjectVeryHeavyToInitialize();
object = new AnotherObject();
你喜欢的IDE会为此向你发出小小的警告。
SetObjectArrayElement
抛出异常会发生什么?分配的数组如何清理?你返回ret
还是NULL
? - iboisver