JNI:不​​知道的大小提前创建jobjectArray [英] JNI : create an jobjectArray without knowing the size in advance

查看:581
本文介绍了JNI:不​​知道的大小提前创建jobjectArray的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用JNI从C返回一个字符串数组到Java。
我看到了,我可以用 NewObjectArray()是这样的:

  JNIEXPORT jobjectArray JNICALL Java_Array_initStringArray(JNIEnv的* ENV,JCLASS CLS,jint大小)
{
 JCLASS stringCls =(* ENV) - GT;的findClass(ENVLjava /朗/字符串;);
 如果(stringCls == NULL)返回NULL; jstringArray结果=(* ENV) - > NewObjectArray(ENV,大小,StringCls,NULL);
 如果(结果== NULL)返回NULL;
 ...
}

但在这里,我不知道 INT尺寸参数:我不知道字符串我会用填充我的数组数。那么,有没有办法不用事先知道数组的大小来创建一个jobjectArray?

喜欢的东西创建一个空数组,然后通过一个数组添加jobject呢?


修改:使用一个ArrayList作为埃德温·建议的解决方案

  JCLASS arrayClass =(* jenv) -  GT;的findClass(jenv的Java / UTIL / ArrayList的);
  如果(arrayClass == NULL)返回NULL;jmethodID mid_init =(* jenv) - >的GetMethodID(jenv,arrayClass,&所述;初始化>中,()V);
  如果(mid_init == NULL)返回NULL;jobject objArr =(* jenv) - GT; NewObject的(jenv,arrayClass,mid_init));
  如果(objArr == NULL)返回NULL;mid_add =(* jenv) - GT;的GetMethodID(jenv,arrayClass,增加,(Ljava /郎/对象;)Z);
  如果(mid_add == NULL)返回NULL;

然后在一个循环中我创建一个 jobject OBJ 为每个新对象我需要添加到ArrayList

  jboolean jbool =(* jenv) -  GT; CallBooleanMethod(jenv,objArr,mid_add,OBJ);
  如果(jbool == NULL)返回NULL;


解决方案

如果你想拥有后备存储(阵列)成长为您添加到它,使用的java.util.ArrayList 。这可能意味着几个JNI调用(设置的对象),但在你的情况下,它听起来就像是值得的。

I would like to return an array of strings from C to Java using JNI. I saw that I could use NewObjectArray() this way:

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; 
 ...
}

But here, I don't know the int size parameter: I don't know the number of strings I'll use to populate my array. So is there a way to create an jobjectArray without knowing in advance the size of the array?

Something like creating an empty array and then adding jobject one by one to that array?


EDIT : solution using an ArrayList as Edwin suggested

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;

Then in a loop I create an jobject obj for each new object I need to add to the arrayList:

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

解决方案

If you want to have the backing store (the array) grow as you add to it, use a java.util.ArrayList. It might mean a few more JNI calls (to set up the object), but in your case it sounds like it's worth the effort.

这篇关于JNI:不​​知道的大小提前创建jobjectArray的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆