Типы аргументов выводятся из метода, который вы вызываете.
В вашем случае, это конструктор класса Event, который ожидает int и String.
Так бы это выглядело так:
jstring metaStr = (*env)->NewStringUTF(env, "hello");
jobject array_element = (*env)->NewObject(
env,
event_class,
ctor,
(jint)4711, metaStr
);
Test
Чтобы выполнить краткий тест, мы могли бы написать класс, который вызывает собственную функцию C, которая создает требуемый объект Event, инициализирует его и возвращает его вызывающей стороне 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