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

问题描述 投票:0回答:1

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

我不知道如何用JNI从返回的java generic中获取一个值。我需要从C++调用的Java代码是。

encoderCapabilities.getQualityRange().getLower()

问题是java返回的是通用类型 Range<Integer>:

public Range<Integer> getQualityRange ()

我试着使用下面的C++代码,但它崩溃了。

GetMethodIDCallObjectMethodV 带功能名称 getQualityRange 和论点 ()Landroid/util/Range;. 似乎没有崩溃,但下一次调用崩溃。

getLower, ()I

能否请你建议一下什么代码可以用?

对象Range是可以的,因为它的方法toString返回有效的字符串"[1,100]",但是 "getLower "在获取methods.Upd时失败。Botje的回答有效!

java android c++ java-native-interface
1个回答
1
投票

类型擦除后。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);
© www.soinside.com 2019 - 2024. All rights reserved.