Я хотел бы вернуть массив строк из 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;