尝试将C ++转换为Java时,decodeIndirectRef中的间接引用无效

时间:2014-11-17 17:14:07

标签: android c++ android-ndk java-native-interface

我正在尝试将一些C ++对象转换为Java对象。 但我有一个奇怪的问题,我无法找出它为什么会发生。

我正在做的是获取C ++对象列表,从中创建Java对象并将其添加到ArrayList。

在我的C ++对象中添加一个新的String(getCoordinates())之前,它一直运行良好。从那以后,它再也不起作用了。

这是我的代码:

    jobject convertCPPTripsToJobject_v2(JNIEnv *env, std::list<Trip> *trips_cpp) {

    // create an ArrayList
    jclass clsArrayList = env->FindClass("java/util/ArrayList");
    jmethodID methodIdInitArray = env->GetMethodID(clsArrayList, "<init>", "()V");
    jobject listTrips = env->NewObject(clsArrayList, methodIdInitArray);

    if (clsArrayList != 0) {
        // we get the id of the add method from the ArrayList
        jmethodID midArrayListAdd = env->GetMethodID(clsArrayList, "add", "(Ljava/lang/Object;)Z");
        if (midArrayListAdd != 0) {
            // create different Java object from the cpp list 
            for (auto trip_cpp : *trips_cpp) {
                // create a ParcourGreen object
                jclass clsParcour = env->FindClass("net/pompoc/greenui/modele/ParcourGreen");
                jmethodID methodIdInitParcour = env->GetMethodID(clsParcour, "<init>", "(IILjava/lang/String;Ljava/lang/String;FZLjava/lang/String;)V");

                jobject parcour = env->NewObject(clsParcour, methodIdInitParcour,
                    trip_cpp.getId(),
                    trip_cpp.getType(),
                    env->NewStringUTF(trip_cpp.getStartDate().c_str()),
                    env->NewStringUTF(trip_cpp.getEndDate().c_str()),
                    trip_cpp.getSteps(),
                    trip_cpp.getIsPostProcessed() ? JNI_TRUE : JNI_FALSE,
                    env->NewStringUTF(trip_cpp.getCoordinates().c_str())
                    );

                env->CallBooleanMethod(listTrips, midArrayListAdd, parcour);
            }
        }
    }

    return listTrips;
}

我收到错误:

Invalid indirect reference 0x00000000 in decodeIndirectRef

(当然不是0x00000000)

非常感谢任何帮助!

修改

以下是我的错误消息:

    11-24 16:20:44.863: W/dalvikvm(16337): Invalid indirect reference 0xbea54328 in decodeIndirectRef
    11-24 16:20:44.863: I/dalvikvm(16337): "main" prio=5 tid=1 RUNNABLE
    11-24 16:20:44.863: I/dalvikvm(16337):   | group="main" sCount=0 dsCount=0 obj=0x41835ea0 self=0x417304c8
    11-24 16:20:44.863: I/dalvikvm(16337):   | sysTid=16337 nice=0 sched=0/0 cgrp=apps handle=1074065748
    11-24 16:20:44.863: I/dalvikvm(16337):   | state=R schedstat=( 0 0 0 ) utm=100 stm=42 core=0
    11-24 16:20:44.863: I/dalvikvm(16337):   at net.pompoc.greenui.modele.ParcourGreen.<init>(ParcourGreen.java:-1)
    11-24 16:24:36.289: E/dalvikvm(19526): VM aborting
    11-24 16:24:36.289: A/libc(19526): Fatal signal 6 (SIGABRT) at 0x00004c46 (code=-6), thread 19526 (com.greenui)

编辑2

经过进一步调查后,似乎这似乎是造成我所有麻烦的原因:

jobject parcour = env->NewObject(clsParcour, methodIdInitParcour,
                trip_cpp.getId(),
                trip_cpp.getType(),
                env->NewStringUTF(trip_cpp.getStartDate().c_str()),
                env->NewStringUTF(trip_cpp.getEndDate().c_str()),
                trip_cpp.getSteps(),
                trip_cpp.getIsPostProcessed() ? JNI_TRUE : JNI_FALSE,
                ---> env->NewStringUTF(trip_cpp.getCoordinates().c_str()) <---
            );

没有这一行,它就可以了。 有了它,它没有。

0 个答案:

没有答案