【发布时间】:2018-04-27 03:03:21
【问题描述】:
在我工作的地方,我们使用 jni,以便能够在我们的应用程序(用 c# 实现)中运行一个用 Java 实现的图形查看器。为此,我们使用 JNI 并且它可以正常工作,问题是现在我们要捕获此 Java 查看器中发生的事件,并在事件发生时启动一个 c# 方法。使用 JNI 可以做到这一点。我已经尝试使用 RegisterNatives () 但我无法让它工作。
我在网上找到的代码是针对 C++ 和 Open JDK 的,我们使用 C# 和 Jdk1.8。
代码示例(来自stackOverflow):
static JNINativeMethod methods[] = {
{"hashCode", "()I", (void *)&JVM_IHashCode},
{"wait", "(J)V", (void *)&JVM_MonitorWait},
{"notify", "()V", (void *)&JVM_MonitorNotify},
{"notifyAll", "()V", (void *)&JVM_MonitorNotifyAll},
{"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone},
};
JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{
(*env)->RegisterNatives(env, cls,
methods, sizeof(methods)/sizeof(methods[0]));
}
Java_java_lang_Object_registerNatives、JNIEXPORT void JNICALL 和函数指针 (void *)&JVM_IHashCode 都不起作用,因为他们不知道 jdk1.8 中调用了哪些函数
有人知道有什么办法吗?
【问题讨论】:
-
您是否可以访问 Java 代码。
-
是的,java代码是我自己实现的。
-
您是否考虑过用 C# / .net 中的内容替换查看器组件?或者这根本不是一个选择?对我来说,仅仅为了一个查看器组件而经历所有这些麻烦似乎很奇怪而且过于复杂。
-
查看器使用完整的 Java GIS API,因此无法替换它。
标签: java c# c++ java-native-interface