我在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楼 票数:2 已采纳

字段的类型必须作为签名给出; 也就是说,你需要使用int - > IT[] - > [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方面更好的东西吗? 在这一方面这样做很丑。

  ask by abhijit jagdale translate from so

未解决问题?本站智能推荐:

1回复

C++ 对 Java 的回调-> 为什么我不能在来自不同线程的回调类中检索 JNIEnv?

我正在尝试构建一个回调类,以便在 Android 上的本机代码中从不同线程调用 Java 方法。 我已经阅读了很多关于如何做到这一点的内容,只要我在同一个线程上,一切都可以。 但是从另一个线程我无法正确检索JNIEnv ,而且我无法弄清楚我做错了什么。 我对 C++ 和 JNI 不是很有经验,所以
1回复

使用 JNI 从 C++ 异步调用 Kotlin 函数

我正在尝试从 C++ 调用在 Kotlin 类NativeConnector 中实现的函数initializationCallback 。 我读到我首先需要将当前线程附加到 JVM,因为执行此代码的线程不是由 JVM 创建的。 附加本身似乎正在工作/没有产生错误,但获取方法 id 失败并出现错误:
1回复

如何将两个jlong​​数据类型转换为jstring,然后将两个字符串连接在一起,以便从JNI将字符串返回给Java?

我在jni类中当前的C函数是: 我想将unCRYPTO_DAT_TmpV0_Buffer.un32和unCRYPTO_DAT_TmpV1_Buffer.un32都从jlong​​转换为jstring,然后将它们串联为一个jstring,以作为单个jstring值返回。 谢谢。
1回复

JNI-向C ++发送大字节[]缓冲区

我正在尝试使用JNI将较大的Java缓冲区byte [](例如460800)发送到C ++函数。 下面是示例代码: 哪里 当我打印buf_size时,我得到一些较小的值,例如2048。 这意味着我没有在JNI函数中收到完整的缓冲区。 我可以使用JNI发送的缓冲区大小是否有限
1回复

从C ++到Java的Android JNI回调

我试图创建一个从jni到java的回调,但是当从cpp线程执行我的代码时,findClass方法返回null,但是从jni线程(本机线程)正确执行了相同的类路径和方法。 }
1回复

将cpp函数指针转换为Java接口方法

我有一个cpp函数指针: 现在在Java中,我有一个接口: 要求是cpp库应将自身添加为java事件的侦听器。 因此,cpp将调用setUpdateCallback(UpdateCallback)以将自身添加为应用程序事件(如果发生)的回调。 JNI方法: 如何从
1回复

为什么同一个本地线程似乎从不同的 Java 线程调用方法?

我正在尝试为我的活动即时设置屏幕亮度。 起初,在我进入ALooper循环之前,我可以通过 JNIEnv 调用CallVoidMethod和 company 轻松地做到这一点。 但是在循环的 65 次迭代之后,我开始不断地收到这样的异常: android.view.ViewRootImpl$C
1回复

如何从Android中的Native C / C ++调用Java API

Android C / C ++本机调用Java API有很多例子。 但是,我读过的所有这些示例都是Android Java API首先调用本机,然后本机通过使用传递的JNI-ENV调用其他Java API。 没有通过的JNI-ENV,C / C ++怎么能得到它? C / C ++本