gpt4 book ai didi

c - JNI : create an jobjectArray without knowing the size in advance

转载 作者:太空狗 更新时间:2023-10-29 16:34:20 25 4
gpt4 key购买 nike

我想使用 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 一个一个添加到该数组?


编辑:按照埃德温的建议使用 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;

最佳答案

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

关于c - JNI : create an jobjectArray without knowing the size in advance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5832884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com