使用 jni 将带有模板的 returns 对象的 java 代码转换为 C++
Convert java code that returns object with template into c++ using jni
我需要使用 JNI 从 C++ 调用一些 java 代码。
我不知道如何使用 JNI 从返回的 java 泛型中获取值。 Java 我需要从 C++ 调用的代码是:
encoderCapabilities.getQualityRange().getLower()
问题是javareturns泛型Range<Integer>
:
public Range<Integer> getQualityRange ()
我尝试使用以下 C++ 代码,但它崩溃了:
GetMethodID
和 CallObjectMethodV
,函数名称 getQualityRange
,参数 ()Landroid/util/Range;
。好像没有崩溃,但是下次调用崩溃:
getLower
, ()I
你能建议什么代码可以工作吗?
对象范围很好,因为它的方法 toString returns 有效字符串“[1,100]”,但是 "getLower" 获取方法失败。
更新: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);
我需要使用 JNI 从 C++ 调用一些 java 代码。
我不知道如何使用 JNI 从返回的 java 泛型中获取值。 Java 我需要从 C++ 调用的代码是:
encoderCapabilities.getQualityRange().getLower()
问题是javareturns泛型Range<Integer>
:
public Range<Integer> getQualityRange ()
我尝试使用以下 C++ 代码,但它崩溃了:
GetMethodID
和 CallObjectMethodV
,函数名称 getQualityRange
,参数 ()Landroid/util/Range;
。好像没有崩溃,但是下次调用崩溃:
getLower
, ()I
你能建议什么代码可以工作吗?
对象范围很好,因为它的方法 toString returns 有效字符串“[1,100]”,但是 "getLower" 获取方法失败。 更新: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);