Android java语言类异常-无法强制转换java向量<;用户定义的java类>;从c&x2B返回+;jni对象回调
我不能从C++ 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("
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()
中有capitalN
?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);