gpt4 book ai didi

java - 通过 JNI 将数据从 C 传递到 Java 的快速方法

转载 作者:搜寻专家 更新时间:2023-11-01 00:55:38 24 4
gpt4 key购买 nike

我在 c 中使用了一些快速通信库,但我的应用程序的其余部分是用 Java 编写的。所以我想将接收到的数据传递给我的 java 应用程序。

作为测试,我每 5 毫秒收到一条消息,共 1000 次。这导致发送方应用程序完成发送时。接收方应用程序仍然需要时间来处理数据。

如果我删除行

(*g_env)->CallVoidMethod(g_env, store_callback, methodHandleMessage, top,
ts, fo, msg);

接收方应用程序在发送方发送最后一条消息后立即完成。

是否有机会加快速度?

void onMessageReceived(char* topic, char* timestamp, char* format,
char* message) {
JNIEnv * g_env;
int getEnvStat = (*g_vm)->GetEnv(g_vm, (void **) &g_env,
JNI_VERSION_1_8);
if (getEnvStat == JNI_EDETACHED) {
if ((*g_vm)->AttachCurrentThread(g_vm, (void **) &g_env, NULL) != 0) {
puts("Failed to attach");
fflush(stdout);
}
}

if (methodHandleMessage) {
} else {
jclass clazz = (*g_env)->GetObjectClass(g_env, store_callback);
methodHandleMessage =
(*g_env)->GetMethodID(g_env, clazz, "handleMessage",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");

}
jstring top = (*g_env)->NewStringUTF(g_env, topic);
jstring ts = (*g_env)->NewStringUTF(g_env, timestamp);
jstring fo = (*g_env)->NewStringUTF(g_env, format);
jstring msg = (*g_env)->NewStringUTF(g_env, message);

//This line takes too long!
(*g_env)->CallVoidMethod(g_env, store_callback, methodHandleMessage, top,
ts, fo, msg);

}

最佳答案

您或许可以节省一些 handleMessage 的时间通过将类标记为 final 来调用,这将消除执行虚拟查找的需要。

如果这还不够,如果handleMessage不需要异步调用,您可以避免直接调用它,而是将参数存储在您将创建和管理的本地 C 数组中。然后您可以通过使用 MonitorEnter 锁定它来通知 Java 对象有一些数据可用。 , 调用 GetMethodID(g_env, clazz, "notify", "()V") , 然后用 MonitorExit 解锁.

然后在 Java 方面,store_callback实例将有一个专门等待通知的线程,如下所示:

while (true) {
synchronized (self) {
wait();
// we were informed that we received new data: now pull it out and process
String[][] args = getBufferedArgumentsViaJNI();
for (String[] arg : args) {
handleMessage(arg[0], arg[1], arg[2], arg[3]);
}
}
}

回到 native 方面,您将需要实现 getBufferedArgumentsViaJNI返回并清除所有缓冲参数的 JNI 数组(留给读者作为练习)。

作为一个精明的读者,您可能想知道为什么这样会更快,因为您仍然需要在 onMessageReceived 中调用 JNI 方法。以及执行 JNI 同步,因此它仍然会产生 JNI 开销。答案是,虽然我不能保证消息处理总体上会更快,但自 wait() 以来,“等待”调用可能会快得多。在我见过的每个 JVM 上都作为 native 方法实现。

关于java - 通过 JNI 将数据从 C 传递到 Java 的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32377432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com