使用 jni 将返回带有模板的对象的 Java 代码转换为 c++

Convert java code that returns object with template into c++ using jni

本文关键字:Java 对象 代码 转换 c++ jni 返回 使用      更新时间:2023-10-16

我需要使用 JNI 从C++调用一些 Java 代码。

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

encoderCapabilities.getQualityRange().getLower()

问题是java返回泛型类型Range<Integer>

public Range<Integer> getQualityRange ()

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

GetMethodIDCallObjectMethodV函数名称getQualityRange和参数()Landroid/util/Range;。似乎没有崩溃,但下一个呼叫崩溃:

getLower()I

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

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

在类型擦除之后,Range#getLower将声明类型Comparable,而不管 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);