【问题标题】:JNI how to pass an array of java objects to a c++ array of the same object typeJNI如何将java对象数组传递给相同对象类型的c++数组
【发布时间】:2019-08-30 11:45:15
【问题描述】:

我的 java 代码中有一个 Foo 类型的数组,我想将它传递给 c++。在 c++ 代码中,我也有一个名为Foo 的类。我只想通过 JNI 传输这个数组。

我有这样的电话:

#include "headers/Foo.h"

extern "C"
    JNIEXPORT void
    JNICALL Java_main_Main_Interface(JNIEnv *env, jobject obj, jobjectArray foo){
        jint size = env->GetArrayLength(foo);
        Foo cfoo[size];
        for(int i = 0; i < size; i++){
            cfoo[i] = env->GetObjectArrayElement(foo, i);
        }
}

然而,这给了我一个错误:Type 'Foo' and 'jobject' are not compatible

我了解这个错误,但我应该怎么做才能消除它?我应该将 jobject 转换为 Foo 类型吗? c++ 会以这种方式理解对象吗?还是我错过了一些 JNI 调用?

【问题讨论】:

    标签: java c++ arrays object java-native-interface


    【解决方案1】:

    我明白这个错误

    不,我不认为你这样做。

    您的 C++ 代码中名为 Foo 的类型与您的 Java Foo 无关。无论类型成员的相似性或相异性如何,具有相同名称都不会在 JNI 边界上产生这种效果。因此,您的问题不仅仅是句法问题,而是更基本的问题。

    但是我应该怎么做才能消除它?我应该将 jobject 转换为 Foo 类型吗? c++ 会以这种方式理解对象吗?还是我错过了一些 JNI 调用?

    这在某种程度上取决于 C++ Foo 的性质,以及您希望它如何工作。

    一种选择是通过复制相应 Java Foo 的所需成员来初始化每个 C++ Foo。这将涉及 JNI 调用以读取对象字段或调用 jobject 上的方法,或两者​​兼而有之。细节取决于两个Foos。

    或者,您可以将 C++ Foo 重写或子类化为代表相应 Java Foojobject 的包装器,通过 JNI 调用将 C++ 方法委托给 jobject。实际上,这与另一个几乎相同,但粒度更细,因此,性能权衡不同。

    【讨论】:

    • 我是 JNI 的新手,所以一个简单的例子会很有帮助,谢谢。
    • @user7331538,这个问题太笼统了,我对一个例子应该关注哪些点没有信心。如果您对 JNI 太陌生以至于不确定如何制定更具体的后续行动,那么我建议您选择并阅读 JNI 教程。不管我提供什么样的例子,你都需要它。
    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多