使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
Convert java code that returns object with template into c++ using jni
我需要使用 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
你能建议什么代码可以工作吗?
对象范围很好,因为它的方法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);
相关文章:
- 在这种情况下,java对象是否可以调用本机函数
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- 如何调用传递给 JNI 'jobject' 的 Java 对象的子类/子类的方法
- JNI 如何将 Java 对象数组传递给相同对象类型的 C++ 数组
- JNI返回Java对象,可以返回本地参考,还是必须是全局
- 在 C/C++ 中获取 Java 对象的内存地址
- JNI Java对象实例化期间的Segfault
- 通过其他线程通过JNI呼叫保存的Java对象
- 使用C 获取Java对象来调用Java方法
- JNI:正确管理Java对象的寿命
- 如何使用 Android NDK 创建 Java 对象(int[])
- Java 对象的内存预留
- SWIG/Java:对象过早地获得GCed
- 从 C/C++ 代码通知 java 对象
- 获取 Java VM 引用,从C++和并发创建 Java 对象
- 需要解释这个Java对象初始化语法
- 支持在JNI c++中添加/删除java对象
- 通过JNI (Cocos2dx)将Java对象转换为c++
- 从c/c++定义/实例化一个java对象
- Java/ c++对象创建顺序