使用JNI将返回对象的java代码转换成C++ 我需要用JNI,< /P>调用C++中的一些java代码。

使用JNI将返回对象的java代码转换成C++ 我需要用JNI,< /P>调用C++中的一些java代码。,java,android,c++,java-native-interface,Java,Android,C++,Java Native Interface,我不知道如何使用JNI从返回的java泛型中获取值。我需要从C++调用的java代码是: encoderCapabilities.getQualityRange().getLower() 问题是java返回泛型类型范围: 我尝试使用下面的C++代码,但是它崩溃了: GetMethodID和CallObjectMethodV,函数名为getQualityRange,参数为Landroid/util/Range;。似乎没有崩溃,但下一次呼叫崩溃: 我是盖特罗 你能建议什么代码可以工作吗 对象范围很

我不知道如何使用JNI从返回的java泛型中获取值。我需要从C++调用的java代码是:

encoderCapabilities.getQualityRange().getLower()
问题是java返回泛型类型范围:

我尝试使用下面的C++代码,但是它崩溃了:

GetMethodID和CallObjectMethodV,函数名为getQualityRange,参数为Landroid/util/Range;。似乎没有崩溃,但下一次呼叫崩溃:

我是盖特罗

你能建议什么代码可以工作吗

对象范围很好,因为其方法toString返回有效字符串[1100],但getLower在获取方法时失败。 Upd:来自Botje的答案有效

在类型擦除之后,RangegetLower将声明类型Compariable,而不管Java源中的类型是什么

请尝试以下方法:

jobject range = ...;
jclass cls_Range = env->GetObjectClass(range);
jmethodID mid_Range_getLower = env->GetMethodID(cls_Range, "getLower", "()Ljava/lang/Comparable;");

jobject lower = env->CallObjectMethod(range, mid_Range_getLower);
jclass cls_Integer = env->GetObjectClass(lower);
jmethodID mid_Integer_intVale = env->GetMethodID(cls_Integer, "intValue", "()I");
jint lowerInt = env->CallIntMethod(lower, mid_Integer_intValue);

你应该把完整的C++代码发布在调用java方法的地方,而不仅仅是它的片段。你也应该发布坠机事件中的stacktrace符号。嗨,Botje,谢谢你的回复。对我来说,对象范围本身是正确的,因为我用toString检查了它,并看到了一个有效的字符串[1100],但是getLower崩溃了,因为找不到方法getLower,下面的代码返回null methodID mid_Range_getLower=env->GetMethodIDcls_Range,getLower,Ljava/lang/object;;啊,我看得不太清楚。T必须至少具有可比性。更新了我的答案。@NikolaiSemenkov那么你应该批准这个答案。
jobject range = ...;
jclass cls_Range = env->GetObjectClass(range);
jmethodID mid_Range_getLower = env->GetMethodID(cls_Range, "getLower", "()Ljava/lang/Comparable;");

jobject lower = env->CallObjectMethod(range, mid_Range_getLower);
jclass cls_Integer = env->GetObjectClass(lower);
jmethodID mid_Integer_intVale = env->GetMethodID(cls_Integer, "intValue", "()I");
jint lowerInt = env->CallIntMethod(lower, mid_Integer_intValue);