2011-04-29 57 views
14

我想使用JNI从C到Java返回一个字符串数组。 我看到了,我可以用NewObjectArray()这样:JNI:在事先不知道大小的情况下创建jobjectArray

JNIEXPORT jobjectArray JNICALL Java_Array_initStringArray(JNIEnv *env, jclass cls, jint size) 
{ 
jclass stringCls = (*env)->FindClass(env, "Ljava/lang/String;"); 
if (stringCls == NULL) return NULL; 

jstringArray result = (*env)->NewObjectArray(env, size, StringCls, NULL); 
if (result == NULL) return NULL; 
... 
} 

但在这里,我不知道int size参数:我不知道的字符串,我会用它来填充我的阵列的数量。那么有没有办法在事先不知道数组大小的情况下创建jobjectArray?

就像创建一个空数组,然后将jobject一个接一个添加到该数组?


EDIT:溶液使用一个ArrayList作为埃德建议

jclass arrayClass = (*jenv)->FindClass(jenv, "java/util/ArrayList"); 
    if (arrayClass == NULL) return NULL; 

jmethodID mid_init = (*jenv)->GetMethodID(jenv, arrayClass, "<init>", "()V"); 
    if (mid_init == NULL) return NULL; 

jobject objArr = (*jenv)->NewObject(jenv, arrayClass, mid_init)); 
    if (objArr == NULL) return NULL; 

mid_add = (*jenv)->GetMethodID(jenv, arrayClass, "add", "(Ljava/lang/Object;)Z"); 
    if (mid_add == NULL) return NULL; 

然后在一个循环我为每个新对象我需要添加到ArrayList创建jobject obj

jboolean jbool = (*jenv)->CallBooleanMethod(jenv, objArr, mid_add, obj); 
    if (jbool == NULL) return NULL; 

回答

10

如果您希望在添加后备存储(阵列)时增长,请使用java.util.ArrayList。这可能意味着更多的JNI调用(设置对象),但在您的情况下,这听起来像是值得的。

+0

没错。我会在星期一看看它。 – leochab 2011-04-29 15:35:07

相关问题