JNI:在不提前知道大小的情况下创建jobjectArray

16

我想使用JNI从C返回一个字符串数组给Java。我看到可以用NewObjectArray()这个函数:

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 一样呢?


编辑: 使用 Edwin 建议的 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;
1个回答

10
如果你想让支持存储(数组)在添加元素时自动扩容,请使用java.util.ArrayList。这可能会导致更多的JNI调用(以设置对象),但在你的情况下,这似乎值得一试。

好的,星期一我会仔细看一下。 - leochab

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