Как получить доступ к Pair <> Java в JNI? - PullRequest
0 голосов
/ 18 сентября 2019

У меня ArrayList<Pair<Pair<Float, Float>, Pair<Float, Float>>> на стороне Java, и я хочу использовать эти данные в JNI.

Какие методы и классы использовать для преобразования в std::pair<std::pair<float, float>, std::pair<float, float>>

Я пытался следовать

jclass pairClass = env->FindClass("android/util/Pair");

jfieldID pairGetKey = env->GetFieldID(pairClass, "first", "java/util/Objects");

pairGetKey всегда равно нулю

1 Ответ

2 голосов
/ 19 сентября 2019

Тип поля должен быть указан как подпись ;то есть вам необходимо использовать кодировку int -> I, T[] -> [T, reference.Type -> Lreference/Type;.Кроме того, тип поля: java.lang.Object, а не java.util.Objects.

jfieldID first = env->GetFieldID(pairClass, "first", "Ljava/lang/Object;");
jfieldID second = env->GetFieldID(pairClass, "second", "Ljava/lang/Object;");

Остальное утомительно, но не сложно:

jfloat extract_float(JNIEnv *env, jobject f) {
    // Note the syntax of signatures: float floatValue() has signature "()F"
    return env->CallFloatMethod(f,
        env->GetMethodID(env->FindClass("java/lang/Float"), "floatValue", "()F"));
}
std::pair<jobject, jobject> extract_pair(JNIEnv *env, jobject p) {
    jclass pairClass = env->FindClass("android/util/Pair");
    jfieldID first = env->GetFieldID(pairClass, "first", "Ljava/lang/Object;");
    jfieldID second = env->GetFieldID(pairClass, "second", "Ljava/lang/Object;");

    return std::pair(env->GetObjectField(p, first), env->GetObjectField(p, second));
}

JNIEnv *env;
jobject pair;
auto [f1, f2] = extract_pair(env, pair);
auto [f11, f12] = extract_pair(env, f1);
auto [f21, f22] = extract_pair(env, f2);
std::pair p(
        std::pair(extract_float(env, f11), extract_float(env, f12)),
        std::pair(extract_float(env, f21), extract_float(env, f22)));

Хотя я думаю, что долженспросите, вам действительно нужно это сделать?Можете ли вы предварительно обработать вложенные пары к чему-то более приятному на стороне Java?Делать это на этой стороне ужасно.

...