Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android java语言类异常-无法强制转换java向量<;用户定义的java类>;从c&x2B返回+;jni对象回调_Android_C++_Android Ndk_Java Native Interface - Fatal编程技术网

Android java语言类异常-无法强制转换java向量<;用户定义的java类>;从c&x2B返回+;jni对象回调

Android java语言类异常-无法强制转换java向量<;用户定义的java类>;从c&x2B返回+;jni对象回调,android,c++,android-ndk,java-native-interface,Android,C++,Android Ndk,Java Native Interface,我不能从C++ JNI回调中返回用户自定义类返回 代码片段如下所示: //科特林班 data class class_record(var id:String?,var class_name:String?,var class_type) //com.example.main活动 public native Object Cls(String id); Vector vec_ classrecord=new Vector(); vec_classrecord=(Vector)Cls("

我不能从C++ JNI回调

中返回用户自定义类返回 代码片段如下所示:

//科特林班

data class  class_record(var id:String?,var class_name:String?,var class_type) 
//com.example.main活动

public native Object Cls(String id);

Vector vec_ classrecord=new Vector();

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

//C++ +JNI代码

外部“C” JNIEXPORT作业对象JNICALL Java_com_示例_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;

    }
jclass java_vector_类;
jMethod java_vector_方法;
jobject java_向量_对象;
AutoVC++记录//调用C++类方法返回类记录指针的向量
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_类,“,”()V”);
java\u vector\u object=env->NewObject(java\u vector\u类,java\u vector\u方法\u构造函数,“”);
用于(自动录制=vec_录制.begin();录制FindClass(“com/example/class_记录”);
javaClassRef=(jclass)env->NewGlobalRef(java_类);
jmethodID cls_constructor=env->GetMethodID(javaClassRef,“,”()V”);
jobject cls_object=env->NewObject(javaClassRef,cls_构造函数,“”);
//设置id
javaMethodRef=env->GetMethodID(javaClassRef,“setId”,“Ljava/lang/String;)V);
std::string strval=record\u it.id;
jni_str=env->NewStringUTF(strval.c_str());
env->CallVoidMethod(cls_对象、javaMethodRef、jni_str);
//设置类名
javaMethodRef=env->GetMethodID(javaClassRef,“setClass_name”,“(Ljava/lang/String;)V”);
std::string strval=record\u it.class\u name;
jni_str=env->NewStringUTF(strval.c_str());
env->CallVoidMethod(cls_对象、javaMethodRef、jni_str);
//设置类类型
javaMethodRef=env->GetMethodID(javaClassRef,“setClass_type”,“(Ljava/lang/String;)V”);
std::string strval=记录\u it.class\u类型;
jni_str=env->NewStringUTF(strval.c_str());
env->CallVoidMethod(cls_对象、javaMethodRef、jni_str);
jmethodID java_vector_add=env->GetMethodID(java_vector_类,“addElement”,“Ljava/lang/Object;)V);
**env->CallVoidMethod(java\u vector\u object、java\u vector\u add、javaClassRef)**
}
返回java_向量_对象;
}

在Kotlin环境下,在返回的数组大小固定的情况下,在数组中,用矢量表示几乎不增加大小的矢量,更好地表达JNI C++回调。

 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);

那么您得到的确切错误是什么?另外,为什么在
newvector()
中有capital
N
?kotlin数据类和java android活动完全可以互操作,以防有人怀疑!!!不要假设JNI调用会成功。在每次进行JNI调用之后,您应该检查返回值并检查抛出的异常。
 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);