JNI调用函数来创建对象

有些名称:

我正在写在C11 JNI的工作人员,并有一个关于严格符合要求的堆对象的创建问题。

JNI API提供的函数具有以下签名来做到这一点:

jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...);

如在规定的6.5.2.2(p7)标准

函数原型声明符中的省略号表示法导致的参数类型转换到停止的最后一个声明参数后。

对应于省略号表示法参数应该显式转换为预期的类型,以使代码要符合。考虑以下情况:

public class Event{
    public final int eventType;
    public final String meta;

    public Event(int eventType, String meta){
        this.eventType = eventType;
        this.meta = meta;
    }
}

什么类型的参数,我应该转换到对应的省略号参数?

我可以猜测,它应该如下所示:

jclass event_class = ((*env)->FindClass)(env, "f/q/c/n/Event");
jmethodID ctor = (*env)->GetMethodID(
    env, 
    event_class, 
    "<init>", 
    "(ILjava/lang/String;)V"
);
array_element = (*env)->NewObject(
    env, 
    event_class, 
    ctor, 
    (jint) 0, (jobject) NULL //corresponds to the ellipsis
);
斯蒂芬错误:

该类型的参数从您所呼叫的方法推导。

在你的情况下,它是需要int和字符串事件类的构造函数。

因此,它是这样的:

jstring metaStr = (*env)->NewStringUTF(env, "hello");

jobject array_element = (*env)->NewObject(
        env,
        event_class,
        ctor,
        (jint)4711, metaStr
);

测试

要执行一个简单的测试,我们可以编写调用创建所需的事件对象,初始化一个本地C函数的类,它返回到调用Java端。

这个Java程序是这样的:

import f.q.c.n.Event;

public class JNIEventTest {

    static {
        System.loadLibrary("native");
    }

    private native Event retrieveNativeEvent();


    public static void main(String[] args) {
        JNIEventTest jniEventTest = new JNIEventTest();
        Event event = jniEventTest.retrieveNativeEvent();
        System.out.println("eventType: " + event.eventType);
        System.out.println("meta: " + event.meta);
    }
}

本机C面是这样的,那么:

#include "JNIEventTest.h"

JNIEXPORT jobject JNICALL Java_JNIEventTest_retrieveNativeEvent(JNIEnv *env, jobject thisObject) {


    jclass event_class = ((*env)->FindClass)(env, "f/q/c/n/Event");
    jmethodID ctor = (*env)->GetMethodID(
            env,
            event_class,
            "<init>",
            "(ILjava/lang/String;)V"
    );

    jstring eventStr = (*env)->NewStringUTF(env, "hello");

    jobject array_element = (*env)->NewObject(
            env,
            event_class,
            ctor,
            (jint)4711, eventStr
    );

    return array_element;
}

在控制台的调试输出,那么看起来是这样的:

eventType: 4711
meta: hello

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么要使用立即调用的函数来创建新对象?

您可以调用基类的构造函数来创建派生对象吗?

通过显式调用其析构函数和构造函数来重新创建对象

通过手动调用构造函数来创建props对象是否安全并且建议这样做?

如何创建布尔函数来列出通用集合中的对象?

创建一个纯函数来合并对象

是否存在R函数来重复创建对象?

创建对象时调用函数

NDK JNI函数调用

无需构造函数调用的C ++对象创建

尝试通过调用函数从类创建对象

动态对象创建和函数调用

没有匹配的函数来调用'const RadioMap :: comp'类型的对象

如何通过将对象作为参数来调用javascript / typescript构造函数?

我无法通过调用defaullt构造函数来创建ClassMirror的新实例

如何创建一个函数来接受参数并在调用时增加参数?

如何创建函数来创建键数组?

如何创建一个JavaScript函数来查找彼此嵌套的对象和数组

wxMaxima:通过将字符串代入函数来创建哪种对象?

通过使用带有数字文字的函数来创建临时对象吗?

我如何创建一个函数来检查对象JavaScript数组中的布尔字段

如何创建一个函数来从嵌套对象中检索所有孩子的 id

如何创建调用句柄对象的 uicontrol 对象的回调函数

没有匹配的函数来调用“ getline”

通过调用祖先函数来继承JavaScript

没有匹配的函数来调用sort()

C ++:没有匹配的函数来调用

没有匹配的函数来调用

没有匹配的函数来调用“strlen”