JNI传递对象数组问题!!

jclass clsList = env->FindClass("java/util/ArrayList");
jclass clsCruiseInfo = env->FindClass("com/uniview/netsdk/Bean/CruiseInfoBean");
jclass clsCruisePoint = env->FindClass("com/uniview/netsdk/Bean/CruisePointBean");
jmethodID mtdListInit = env->GetMethodID(clsList, "", "()V");
jmethodID mtdListAdd = env->GetMethodID(clsList, "add", "(Ljava/lang/Object;)Z");
jmethodID mtdCuriseInit = env->GetMethodID(clsCruiseInfo, "", "()V");
jmethodID mtdCuriseID = env->GetMethodID(clsCruiseInfo, "setDwCuriseID", "(I)V");
jmethodID mtdCuriseName = env->GetMethodID(clsCruiseInfo, "setSzCuriseName", "(Ljava/lang/String;)V");
jmethodID mtdSize = env->GetMethodID(clsCruiseInfo, "setDwSize", "(I)V");
jmethodID mtdCruisePoint = env->GetMethodID(clsCruiseInfo, "setAstCruisePoint", "([Lcom/uniview/netsdk/Bean/CruisePointBean;)V");
jmethodID mtdCruisePointInit = env->GetMethodID(clsCruisePoint, "", "()V");
jmethodID mtdPresetID = env->GetMethodID(clsCruisePoint, "setDwPresetID", "(I)V");
jmethodID mtdStayTime = env->GetMethodID(clsCruisePoint, "setDwStayTime", "(I)V");
jmethodID mtdSpeed = env->GetMethodID(clsCruisePoint, "setDwSpeed", "(I)V");
jmethodID mtdReserve = env->GetMethodID(clsCruisePoint, "setDwReserve", "(I)V");
jsize len1 = stCuriseList.dwSize;
for(int i = 0; i < len1; i++)

{
jobject objCruiseInfo = env->NewObject(clsCruiseInfo, mtdCuriseInit, "");
env->CallVoidMethod(objCruiseInfo, mtdCuriseID, (jint)stCuriseList.astCruiseInfo[i].dwCuriseID);
env->CallVoidMethod(objCruiseInfo, mtdCuriseName, env->NewStringUTF(stCuriseList.astCruiseInfo[i].szCuriseName));
env->CallVoidMethod(objCruiseInfo, mtdSize, (jint)stCuriseList.astCruiseInfo[i].dwSize);
jsize len2 = stCuriseList.astCruiseInfo[i].dwSize;
printf("1\n");
jobject arrayCount = env->AllocObject(clsCruiseInfo);

for(int k = 0; k < len2; k++)

{
jobject objobjCruisePoint = env->NewObject(clsCruisePoint, mtdCruisePointInit, "");
env->CallVoidMethod(objobjCruisePoint, mtdPresetID, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwPresetID);
env->CallVoidMethod(objobjCruisePoint, mtdStayTime, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwStayTime);
env->CallVoidMethod(objobjCruisePoint, mtdSpeed, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwSpeed);
env->CallVoidMethod(objobjCruisePoint, mtdReserve, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwReserve);
env->CallBooleanMethod(arrayCount, mtdListAdd, objobjCruisePoint);
}

        env->CallObjectMethod(objCruiseInfo, mtdCruisePoint, arrayCount);

        env->CallBooleanMethod(pstCruiseList, mtdListAdd, objCruiseInfo);

在倒数第二行报错,请大神解答!

先前代码有点乱 重贴一份

 jclass clsList = env->FindClass("java/util/ArrayList");
        jclass clsCruiseInfo = env->FindClass("com/uniview/netsdk/Bean/CruiseInfoBean");
        jclass clsCruisePoint = env->FindClass("com/uniview/netsdk/Bean/CruisePointBean");
        jmethodID mtdListInit = env->GetMethodID(clsList, "<init>", "()V");
        jmethodID mtdListAdd = env->GetMethodID(clsList, "add", "(Ljava/lang/Object;)Z");
        jmethodID mtdCuriseInit = env->GetMethodID(clsCruiseInfo, "<init>", "()V");
        jmethodID mtdCuriseID = env->GetMethodID(clsCruiseInfo, "setDwCuriseID", "(I)V");
        jmethodID mtdCuriseName = env->GetMethodID(clsCruiseInfo, "setSzCuriseName", "(Ljava/lang/String;)V");
        jmethodID mtdSize = env->GetMethodID(clsCruiseInfo, "setDwSize", "(I)V");
        jmethodID mtdCruisePoint = env->GetMethodID(clsCruiseInfo, "setAstCruisePoint", "([Lcom/uniview/netsdk/Bean/CruisePointBean;)V");
        jmethodID mtdCruisePointInit = env->GetMethodID(clsCruisePoint, "<init>", "()V");
        jmethodID mtdPresetID = env->GetMethodID(clsCruisePoint, "setDwPresetID", "(I)V");
        jmethodID mtdStayTime = env->GetMethodID(clsCruisePoint, "setDwStayTime", "(I)V");
        jmethodID mtdSpeed = env->GetMethodID(clsCruisePoint, "setDwSpeed", "(I)V");
        jmethodID mtdReserve = env->GetMethodID(clsCruisePoint, "setDwReserve", "(I)V");
        jsize len1 = stCuriseList.dwSize;
        for(int i = 0; i < len1; i++)  
        {
            jobject objCruiseInfo = env->NewObject(clsCruiseInfo, mtdCuriseInit, "");
            env->CallVoidMethod(objCruiseInfo, mtdCuriseID, (jint)stCuriseList.astCruiseInfo[i].dwCuriseID);
            env->CallVoidMethod(objCruiseInfo, mtdCuriseName, env->NewStringUTF(stCuriseList.astCruiseInfo[i].szCuriseName));
            env->CallVoidMethod(objCruiseInfo, mtdSize, (jint)stCuriseList.astCruiseInfo[i].dwSize);
            jsize len2 = stCuriseList.astCruiseInfo[i].dwSize;
            printf("1\n");
            jobject arrayCount = env->AllocObject(clsCruiseInfo);  
            for(int k = 0; k < len2; k++)  
            {
                jobject objobjCruisePoint = env->NewObject(clsCruisePoint, mtdCruisePointInit, "");
                env->CallVoidMethod(objobjCruisePoint, mtdPresetID, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwPresetID);
                env->CallVoidMethod(objobjCruisePoint, mtdStayTime, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwStayTime);
                env->CallVoidMethod(objobjCruisePoint, mtdSpeed, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwSpeed);
                env->CallVoidMethod(objobjCruisePoint, mtdReserve, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwReserve);
                env->CallBooleanMethod(arrayCount, mtdListAdd, objobjCruisePoint);
            }
            env->CallObjectMethod(objCruiseInfo, mtdCruisePoint, arrayCount);
            env->CallBooleanMethod(pstCruiseList, mtdListAdd, objCruiseInfo);

java类:

 public class CruiseInfoBean {

    private int  dwCuriseID;                                /* 轨迹ID  Route ID */
    private String szCuriseName;                            /* 轨迹名称  Route name */
    private int  dwSize;                                    /* 路径包含的轨迹点数量  Number of presets included in the route */
    private List<CruisePointBean> astCruisePoint;    /* 路径包含的轨迹点信息   Information of presets included in the route */

    public CruiseInfoBean(){

    }

    public int getDwCuriseID() {
        return dwCuriseID;
    }

    public void setDwCuriseID(int dwCuriseID) {
        this.dwCuriseID = dwCuriseID;
    }

    public String getSzCuriseName() {
        return szCuriseName;
    }

    public void setSzCuriseName(String szCuriseName) {
        this.szCuriseName = szCuriseName;
    }

    public int getDwSize() {
        return dwSize;
    }

    public void setDwSize(int dwSize) {
        this.dwSize = dwSize;
    }

    public List<CruisePointBean> getAstCruisePoint() {
        return astCruisePoint;
    }

    public void setAstCruisePoint(List<CruisePointBean> astCruisePoint) {
        this.astCruisePoint = astCruisePoint;
    }

}

 package com.uniview.netsdk.Bean;

public class CruisePointBean {
    private int  dwPresetID;                  /* 预置位ID  Preset ID */
    private int  dwStayTime;                  /* 停留时间  Stay time */
    private int  dwSpeed;                     /* 转动速度  Speed */
    private int  dwReserve;                   /* 保留字段  Reserved */

    public CruisePointBean(){

    }

    public int getDwPresetID() {
        return dwPresetID;
    }

    public void setDwPresetID(int dwPresetID) {
        this.dwPresetID = dwPresetID;
    }

    public int getDwStayTime() {
        return dwStayTime;
    }

    public void setDwStayTime(int dwStayTime) {
        this.dwStayTime = dwStayTime;
    }

    public int getDwSpeed() {
        return dwSpeed;
    }

    public void setDwSpeed(int dwSpeed) {
        this.dwSpeed = dwSpeed;
    }

    public int getDwReserve() {
        return dwReserve;
    }

    public void setDwReserve(int dwReserve) {
        this.dwReserve = dwReserve;
    }

}

env->CallObjectMethod(objCruiseInfo, mtdCruisePoint, arrayCount);
你这一句参数不对吧,要求是一个list,你传的也不是一个对象数组 啊

我改成对象数组还是不对,jmethodID mtdCruisePoint = env->GetMethodID(clsCruiseInfo, "setAstCruisePoint", "([Ljava/lang/Object;)V");
这一句的第三个参数有没有错啊

                    jclass clsList = env->FindClass("java/util/ArrayList");
        jclass clsCruiseInfo = env->FindClass("com/uniview/netsdk/Bean/CruiseInfoBean");
        jclass clsCruisePoint = env->FindClass("com/uniview/netsdk/Bean/CruisePointBean");
        jmethodID mtdListInit = env->GetMethodID(clsList, "<init>", "()V");
        jmethodID mtdListAdd = env->GetMethodID(clsList, "add", "(Ljava/lang/Object;)Z");
        jmethodID mtdCuriseInit = env->GetMethodID(clsCruiseInfo, "<init>", "()V");
        jmethodID mtdCuriseID = env->GetMethodID(clsCruiseInfo, "setDwCuriseID", "(I)V");
        jmethodID mtdCuriseName = env->GetMethodID(clsCruiseInfo, "setSzCuriseName", "(Ljava/lang/String;)V");
        jmethodID mtdSize = env->GetMethodID(clsCruiseInfo, "setDwSize", "(I)V");
        jmethodID mtdCruisePoint = env->GetMethodID(clsCruiseInfo, "setAstCruisePoint", "([Ljava/lang/Object;)V");
        jmethodID mtdCruisePointInit = env->GetMethodID(clsCruisePoint, "<init>", "()V");
        jmethodID mtdPresetID = env->GetMethodID(clsCruisePoint, "setDwPresetID", "(I)V");
        jmethodID mtdStayTime = env->GetMethodID(clsCruisePoint, "setDwStayTime", "(I)V");
        jmethodID mtdSpeed = env->GetMethodID(clsCruisePoint, "setDwSpeed", "(I)V");
        jmethodID mtdReserve = env->GetMethodID(clsCruisePoint, "setDwReserve", "(I)V");
        jsize len1 = stCuriseList.dwSize;
        for(int i = 0; i < len1; i++)  
        {
            jobject objCruiseInfo = env->NewObject(clsCruiseInfo, mtdCuriseInit, "");
            env->CallVoidMethod(objCruiseInfo, mtdCuriseID, (jint)stCuriseList.astCruiseInfo[i].dwCuriseID);
            env->CallVoidMethod(objCruiseInfo, mtdCuriseName, env->NewStringUTF(stCuriseList.astCruiseInfo[i].szCuriseName));
            env->CallVoidMethod(objCruiseInfo, mtdSize, (jint)stCuriseList.astCruiseInfo[i].dwSize);
            jsize len2 = stCuriseList.astCruiseInfo[i].dwSize;
            printf("1\n");
            jobjectArray arrayCount = env->NewObjectArray(len2, clsCruisePoint, NULL);
            for(int k = 0; k < len2; k++)  
            {
                jobject objobjCruisePoint = env->NewObject(clsCruisePoint, mtdCruisePointInit, "");
                env->CallVoidMethod(objobjCruisePoint, mtdPresetID, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwPresetID);
                env->CallVoidMethod(objobjCruisePoint, mtdStayTime, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwStayTime);
                env->CallVoidMethod(objobjCruisePoint, mtdSpeed, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwSpeed);
                env->CallVoidMethod(objobjCruisePoint, mtdReserve, (jint)stCuriseList.astCruiseInfo[i].astCruisePoint[k].dwReserve);
                (env)->SetObjectArrayElement(arrayCount, k, objobjCruisePoint); 
            }
            printf("no\n");
            env->CallObjectMethod(objCruiseInfo, mtdCruisePoint, arrayCount);
            printf("yes\n");
            env->CallBooleanMethod(pstCruiseList, mtdListAdd, objCruiseInfo);
        }