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

leo*_*hab 15 c arrays java-native-interface

我想使用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; 
 ...
}
Run Code Online (Sandbox Code Playgroud)

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

有点像创建一个空数组,然后逐个添加jobject到该数组?


编辑:使用ArrayList的解决方案,如Edwin建议的那样

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;
Run Code Online (Sandbox Code Playgroud)

然后在循环中,我jobject obj为每个需要添加到arrayList的新对象创建一个:

jboolean jbool = (*jenv)->CallBooleanMethod(jenv, objArr, mid_add, obj);
  if (jbool == NULL) return NULL;
Run Code Online (Sandbox Code Playgroud)

Edw*_*uck 10

如果要在添加时增加后备存储(数组),请使用java.util.ArrayList.它可能意味着更多的JNI调用(设置对象),但在你的情况下,它听起来值得付出努力.