在我工作的地方,我们使用jni,以便能够在我们的应用程序(用c#实现)中运行一个用Java实现的图形查看器。要做到这一点,我们使用JNI并正确地工作,问题是现在我们希望捕获在这个Java查看器中发生的事件,并在事件发生时启动一个c#方法。用JNI可以做到这一点。我尝试过使用RegisterNatives (),但是我无法让它工作。
我在互联网上找到的代码是用于C++和Open的,我们使用C#和JDK 1.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和函数指针(void *)&JVM_IHashCode都不工作,因为它们不知道在nor 1.8中调用了哪些函数。
有没有人知道有没有办法弄到这个?
发布于 2017-11-14 09:08:51
免责声明--我完全不理解你注册本地用户的方法,所以也许我理解你的要求是错误的。
我有两种选择给你。
下面是一个例子:
class MyEntryPoint {
public static List<Runnable> list = new ArrayList<>();
public void fire() {
list.forEach(Runnable::run);
}
public void addListener(Runnable listener) {
list.add(listener);
}
}然后通过.Net通过JNI访问这个静态类并添加侦听器。Java应用程序通知所有有用的事件。您应该用适当的接口替换Runnable。
最困难的部分是在C#中实现接口。
Java应用程序中创建tcp服务器并从.Net连接到它。https://stackoverflow.com/questions/47281136
复制相似问题