繁体   English   中英

如何在 JNI 中访问 Java 的 Pair<>?

How to access Pair<> of Java in JNI?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在 Java 端有ArrayList<Pair<Pair<Float, Float>, Pair<Float, Float>>>并想在 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总是 null

1 个回复

字段的类型必须作为签名给出; 也就是说,你需要使用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;");

rest 很乏味,但并不难:

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 端将嵌套对预处理成更好的东西吗? 在这方面做是丑陋的。

2 值是按引用还是按值存储在 std::pair<> 中?

所以我有一个类myClass和它两个私有变量,假设 i,j 和一个类方法myMethod如下- 我从另一个函数调用该方法如下 - 所以如果我编辑receivedPair让我们说 类变量i也会变成等于 200 吗? 我基本上需要通过引用串联的几个函数来传递变量,以便更新相同的内存位置... ...

3 如何对vector <pair <int,pair进行排序 >>>>?

我正在学习通过将STL的排序函数用于一些复杂的成对向量来使用它。 我有以下向量: 我首先需要基于该对中的第一个整数对元素进行排序,如果事实证明有2个元素具有相同的值,那么我需要根据内部对中存在的整数对它们进行排序。 如果我将上述类型表示为: 首先,我需要根据I对它们进 ...

6 Java中的Java jbytearray访问(JNI)

我有一组在我的工作中需要在C / C ++中运行的java类。 而且,由于我对java很新,所以我一步一个脚印。 我已经能够用string,int double等调用java了,但是最终结果将得到一个字节数组(pdf文档)所以我试着发回一个简单的两个元素字节数组。 这是java: ...

10 Java中的“ </>”有什么含义吗?

现在,我知道StackOverflow并不是寻求作业帮助的地方,但是这个问题让我完全困惑。 我把它展示给我的朋友,他们和我一样困惑。 我对此问题进行了两次尝试,未尝试选择任何答案,但都被标记为错误,而仅选择了第三次尝试,则被标记为错误。 因此,这与获得信誉无关,因为我已经为此失去了信誉 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM