java lang class 异常 - 无法从 c++ jni 对象回调中转换 java vector<user defined java class> return

java lang class exception -Unable to cast the java vector<user defined java class> return from c++ jni object callback

我无法从 C++ jni 回调

中回退用户自定义 class return

代码片段如下:

//Kotlin class

data class  class_record(var id:String?,var class_name:String?,var class_type) 

// com.example.MainActivity

public native Object Cls(String id);

Vector vec_ classrecord=new Vector();

vec_classrecord=(Vector)Cls("1234");

// C++ jni代码

外部"C" JNIEXPORT 工作对象 JNICALL Java_com_example_MainActivity_Cls(JNIEnv *env, jobject 实例, jstring id, ) {

        jclass java_vector_class;
         jmethodID  java_vector_method;
         jobject java_vector_object ;



       auto vec_record=// call c++ method that return vector for class record pointer   


        jstring jni_str;
        jclass javaClassRef;

      // jni for java.util.Vector
        java_vector_class = env->FindClass("java/util/Vector");
        java_vector_method_constructor = env->GetMethodID(java_vector_class, "<init>", "()V");
        java_vector_object = env->NewObject(java_vector_class, java_vector_method_constructor, "");


        for (auto record_it = vec_record.begin(); record_it < vec_record.end(); ++record_it) {

        // jni  for class_record
            jclass java_class = env->FindClass("com/example/class_record");
            javaClassRef = (jclass) env->NewGlobalRef(java_class);
            jmethodID cls_constructor = env->GetMethodID(javaClassRef, "<init>", "()V");
            jobject cls_object = env->NewObject(javaClassRef, cls_constructor, "");

            // set id

            javaMethodRef = env->GetMethodID(javaClassRef, "setId", "(Ljava/lang/String;)V");

            std::string strval = record_it.id;

            jni_str = env->NewStringUTF(strval.c_str());
            env->CallVoidMethod(cls_object, javaMethodRef, jni_str);

            // set class_name
            javaMethodRef = env->GetMethodID(javaClassRef, "setClass_name","(Ljava/lang/String;)V");

             std::string strval = record_it.class_name;
             jni_str = env->NewStringUTF(strval.c_str());

            env->CallVoidMethod(cls_object, javaMethodRef, jni_str);
            //set class_type

            javaMethodRef = env->GetMethodID(javaClassRef, "setClass_type","(Ljava/lang/String;)V");
            std::string strval = record_it.class_type;
            jni_str = env->NewStringUTF(strval.c_str());                             

            env->CallVoidMethod(cls_object, javaMethodRef, jni_str);


            jmethodID java_vector_add = env->GetMethodID(java_vector_class, "addElement","(Ljava/lang/Object;)V");
            **env->CallVoidMethod(java_vector_object, java_vector_add, javaClassRef);**


        }


        return java_vector_object;

    }
env->CallVoidMethod(java_vector_object, java_vector_add, cls_object);

在 Kotlin 环境下,最好在 ArrayList 中表达 jni c++ 回调而不是 vector,在返回的 arraylist 是固定大小不可变的情况下,它的大小几乎增加了一倍,如下所示。

 java_util_class = env->FindClass("java/util/ArrayList");

        jmethodID java_add= env->GetMethodID(java_util_class, "add","(Ljava/lang/Object;)Z");
        env->CallBooleanMethod(java_object, java_add, cls_object);

sample tutorial