JNI: создать jobjectArray, не зная заранее размер - PullRequest
15 голосов
/ 29 апреля 2011

Я хотел бы вернуть массив строк из C в Java, используя JNI.Я видел, что могу использовать 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, не зная заранее размер массива?

Что-то вроде создания пустого массива и последующего добавления в него массива по одному заданию?


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;

Затем в цикле я создаю jobject obj для каждого нового объекта, который мне нужно добавить в arrayList:

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

1 Ответ

10 голосов
/ 29 апреля 2011

Если вы хотите, чтобы резервное хранилище (массив) увеличивалось по мере добавления к нему, используйте java.util.ArrayList.Это может означать еще несколько вызовов JNI (для настройки объекта), но в вашем случае это звучит так, как будто стоит усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...