java - 使用 jni 将返回带有模板的对象的 java 代码转换为 c++
问题描述
我需要使用 JNI 从 C++ 调用一些 java 代码。
我不知道如何使用 JNI 从返回的 java 泛型中获取值。我需要从 C++ 调用的 Java 代码是:
encoderCapabilities.getQualityRange().getLower()
问题是java返回泛型类型Range<Integer>
:
public Range<Integer> getQualityRange ()
我尝试使用以下 C++ 代码,但它崩溃了:
GetMethodID
并CallObjectMethodV
带有函数名称getQualityRange
和参数()Landroid/util/Range;
。似乎没有崩溃,但下一次调用崩溃:
getLower
,()I
你能建议什么代码可以工作吗?
对象 Range 很好,因为它的 toString 方法返回有效字符串“[1,100]”,但“getLower”在获取方法时失败。更新:Botje的答案有效!
解决方案
在类型擦除之后,无论 Java 源代码中的类型是什么,Range#getLower
都将声明 type 。Comparable
试试这个:
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);
推荐阅读
- amazon-web-services - AWS 客户端似乎没有读取配置文件来读取区域
- pine-script - 如何获取由指标绘制的线的颜色并根据该颜色分配一个数字(如果颜色 X,-1 或如果颜色 y,+1)?
- reactjs - 如何将密钥传递给反应组件
- hive - GreenPlum UDF 函数转换为 Hive
- bootstrap-4 - Bootstrap 链接上的圆角
- python - 创建带有描述的图像报告
- javascript - 类别选择上的 Ajax 功能
- sql - 从不同的参数返回计数
- spring - 容器环境中的 Spring Webflux cpu
- unity3d - 编辑器中的游戏 UI 已缩放(Unity,仅限 Android)