【问题标题】:How to call a C++ method returning an array from JNI and convert the contents of the array to an array of java classes?如何调用从 JNI 返回数组的 C++ 方法并将数组的内容转换为 java 类的数组?
【发布时间】:2015-01-28 16:20:39
【问题描述】:

我正在创建一个 C++ 库,我想将它移植到 java。我有一个方法,它通过调用GetRawInputDeviceList() 获取RAWINPUTDEVICELIST,并滚动数组并将每个项目转换为名为@9​​87654323@ 的类的实例,并将它们添加到C++ 中的数组中。我想调用此方法并将列表的内容转换为 java 类的数组,称为 Device,并将其中包含的变量分配给 C++ 类的值。

编辑:假设我要转换的数组包含如下所示的 C++ 类的实例:

class CplusplusExampleClass {
public:
    int variable;
};

我想将 C++ 数组中包含的该类的所有实例转换为 java 类的相应实例。假装java类是这样的:

public class JavaExampleClass {
    public int variable;
}

这可以通过@Gergely 建议的问题的答案中描述的方法来完成,只需转换整数,然后为每个类创建一个新实例,但假装这些类包含很多东西,比如对象(类实例)、其他变量等。

这可能吗,然后,我该怎么做?

【问题讨论】:

    标签: java c++ arrays java-native-interface data-conversion


    【解决方案1】:

    这不是你想要的吗? How to return an array from JNI to Java?

    这里有一些更详细的例子:https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-6.2

    如果你想从 JNI 代码创建 Java 对象,那是特别痛苦的。像这样的:

    jclass cls = (*env)->FindClass(env, "...your class...");
    jmethodID ctor = (*env)->GetMethodID(env, cls, "<init>", "...your ctor signature...");
    jobject obj = (*env)->NewObject(env, cls, ctor, ...);
    

    此外,您当然应该对所有这些的返回值进行空值检查。

    之后,您可以创建 Java 数组并将项目添加到其中:

    jobjectArray results = (*env)->NewObjectArray(env, 100, cls, NULL);
    (*env)->SetObjectArrayElement(env, results, 0, obj);
    

    【讨论】:

    • 是的,但是有一个问题。该答案描述了如何使用int 数组来完成它,但是如果我有一个我自己创建的 C++ 类实例数组,并且想将它们转换为我自己创建的一个 java 类实例数组,该怎么办?对应于C++类实例?编辑:我会在我的问题中澄清它!
    • 我认为它应该几乎相同,除了它是一个对象数组。这更多地取决于您要在哪里创建它。在 Java 中这很简单,您只需调用 new,然后通过 JNI 将引用传递给 C++。如果你想在 C++ 中创建 Java 对象,那就更复杂了,因为你需要做一些类似的事情:获取一个指向你的对象的类指针,获取一个指向构造函数的方法指针,调用构造函数,还创建一个对象数组并用您的对象填充它 - 关键是,这些步骤中的每一个都只能通过调用 JNI 的方法来完成。
    • 什么是ctor签名?
    • 它是一个字符串,它指定方法的参数和返回值(在这种情况下是构造函数 - 构造函数只是一个名为 的特殊方法),在 JNI 中这是告诉 JVM 您想要获取处理程序的特定方法的唯一方法。看看这里:docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/…
    • 所以,假设我有一个变量 v,我想将它传递给 java 类的构造函数,它会在字段中显示“......你的 ctor 签名。 ..”?
    猜你喜欢
    • 2012-07-31
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2013-04-23
    • 2012-01-11
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多