【问题标题】:java lang class exception -Unable to cast the java vector<user defined java class> return from c++ jni object callbackjava lang 类异常 - 无法从 c++ jni 对象回调中转换 java 向量<用户定义的 java 类> 返回
【发布时间】:2019-07-22 14:28:35
【问题描述】:

我无法从 C++ jni 回调中回退用户自定义类返回

sn-p 代码如下:

//Kotlin 类

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;

    }

【问题讨论】:

  • 那么你得到的确切错误是什么?另外,为什么New Vector() 中有大写的N
  • kotlin 数据类和 java android 活动是完全可互操作的,以防万一有人怀疑!!!
  • 不要假设 JNI 调用会成功。每次 JNI 调用后,您都应该检查返回值并检查抛出的异常。

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


【解决方案1】:
env->CallVoidMethod(java_vector_object, java_vector_add, cls_object);

在 Kotlin 环境下,最好在 ArrayList 中表示 jnic c++ 回调,而不是在返回的 arraylist 是固定大小不可变的情况下,使用 sn-p 增长几乎两倍大小的 vector。

 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 2018-03-19
    • 1970-01-01
    • 2017-02-24
    • 2015-07-17
    • 2011-10-07
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多