在JNI中,如何为jobjectArray分配值?

3

我有一个对象数组,在Java中初始化如下:

Record[] pRecords = new Record[5];
ret = GetRecord(pRecords);

我将这个数组传递给JNI,JNI会调用CPP,最终填充数组。

JNIEXPORT jint JNICALL Java_GetRecord
  (JNIEnv *jEnv, jobject ObjApp, jobjectArray jRecords)
{
    Record  *pRecords = (Record *)malloc(5*sizeof(Record  ));   

    ret = Get_Record(pRecords); // call to CPP
    if(SUCCESS == ret)
    {
        jclass c = (jEnv)->GetObjectClass(jRecords);
        jfieldID  fid = (jEnv)->GetFieldID(c, "m_session", "I");
        (jEnv)->SetIntField (jRecords, fid, pRecords [0].value);
    }
}

我得到了 fidNULL。如何将 pRecords[0].value 赋值给 jRecords 数组的第 0 个元素?

1个回答

2

jobjectArray 不是指向数组第一个元素的指针。请记住,Java 数组本身是一流对象。

fid 是 0,因为你正在查找表示 Java 类 Record 的数组的类中的成员 m_session;当然,数组类没有这样的成员。你需要执行 FindClass() 来获取 Record 类,然后在其中查找该成员。

然后你继续尝试设置该成员。如果它实际上是 Record 类的成员,我想你想要在循环中设置每个数组元素中该成员的值,对吗?当然不是在数组本身中进行,因为你正在尝试这样做。对于每个数组元素,你需要调用适当的方法来获取该数组位置中的对象,然后对该对象进行操作。


感谢您宝贵的回答。现在我已经得到了fid。如何将值分配给jRecord的第0个对象?(jEnv)->SetIntField (jRecords, fid, pRecords [0].value); 在Java中,我想要pRecords[0].m_session = pRecords [0].value of JNI - indira
1
根据您上面的Java代码,jRecords是一个包含五个null元素的数组--也就是说,您需要创建Record对象。在Java中创建数组后再将其传递会更简单一些。然后在JNI代码中循环遍历该数组,调用getObjectArrayElement(env, jRecords, i)五次以获取Record对象,并设置每个对象中的成员。您的成员设置代码基本上没问题,只是应用于错误的对象。 - Ernest Friedman-Hill
jobject pe = (jEnv)->GetObjectArrayElement(jRecords, 0); 获取到 NULL。在 Java 中,我已经创建了 Record 的元素。 - indira
公共类记录 { 公共整型 m_session; 公共整型 m_size; }; 记录[] pRecords = 新 记录[5]; ret = 获取记录(pRecords); - indira
1
在Java中,您必须逐个创建所有五个“Record”对象。对象数组是指向单独对象的引用数组;这就像C++中的指向对象的指针数组。因此:Record[] pRecords = new Record[5]; for (int i=0; i<5; ++i) pRecords[i] = new Record(); ret = GetRecord(pRecords); - Ernest Friedman-Hill
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接