Исключение класса Java-Lang -Не удается привести вектор Javaвозврат из c ++ jni объекта обратного вызова - PullRequest
0 голосов
/ 28 февраля 2019

Я не могу вернуть пользовательский класс, возвращаемый из обратного вызова C ++ jni

, фрагмент кода:

// Kotlin class

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

// com.*

        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;

    }

1 Ответ

0 голосов
/ 28 февраля 2019
env->CallVoidMethod(java_vector_object, java_vector_add, cls_object);

В среде Kotlin гораздо лучше выразить обратный вызов jni c ++ в 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);

пример учебника

...