【发布时间】:2011-08-28 04:15:54
【问题描述】:
我需要从 C++ 中获取一个字符串列表 (char*) 并将其返回给 Java。
我该怎么做?
我认为一种解决方案是返回一个预定义的大字符串,例如:“[item1][item2]”并在 Java 上进行拆分,但这看起来不是正确的方法。
【问题讨论】:
标签: android arrays java-native-interface android-ndk
我需要从 C++ 中获取一个字符串列表 (char*) 并将其返回给 Java。
我该怎么做?
我认为一种解决方案是返回一个预定义的大字符串,例如:“[item1][item2]”并在 Java 上进行拆分,但这看起来不是正确的方法。
【问题讨论】:
标签: android arrays java-native-interface android-ndk
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]));
在这种情况下,一个简单的“NULL”就足够了,因为一旦执行下一行,指定的初始元素就可以用于垃圾回收。这就像在 Java 代码中编写以下代码:
int i = 0;
i = 1;
或者更糟:
Object object = new BigObjectVeryHeavyToInitialize();
object = new AnotherObject();
您最喜欢的 IDE 会为此向您发出一点警告。
【讨论】:
在 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);
}
未测试!!!
让我知道它是否适合你
问候
【讨论】:
SetObjectArrayElement 抛出异常会发生什么?如何清理分配的数组?你返回ret 还是NULL?