Search code examples
javaandroidc++java-native-interface

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


I need to call some java code from C++ using JNI.

I can't figure out how to get a value from a returned java generic with JNI. Java code that I need to call from C++ is:

encoderCapabilities.getQualityRange().getLower()

The problem is java returns the generic type Range<Integer>:

public Range<Integer> getQualityRange ()

I tried to use following C++ code, but it crash:

GetMethodID and CallObjectMethodV with function name getQualityRange and arguments ()Landroid/util/Range;. It seems did not crash, but next call crash:

getLower, ()I

Could you please suggest what code can work?

The object Range is fine as its method toString returns valid string "[1,100]", but "getLower" failed on getting methods. Upd: The Answer from Botje works!


Solution

  • After type erasure, Range#getLower will have declared type Comparable, regardless of what the type in the Java source was.

    Try this instead:

    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);