我正在使用jni4net从C#应用程序中访问Java代码,反之亦然。jni4net使用反射来生成JNI代码代理,因此很明显,其中一个限制是您的C#和Java代码必须编译才能构建代理。
不幸的是,这可能会导致22条军规的问题。考虑一下:
Java类X使用C#类Y
Java类Y使用C#类X
这两个类都不能编译,因此建立良好的解决方法是采用其中一个类(X或Y),将其剥离为其裸签名,并进行编译,然后从编译后的骨架生成代理。然后,您可以用原始类替换已剥离的类,然后继续您的快乐之路。
对我来说,这似乎是一种丑陋的方法,我相信应该有更好的方法。一个显而易见的解决方案是告诉编译器(无论是C#还是Java,这都无关紧要)忽略对缺失类的引用。
对于C#或Java编译器来说,忽略对某个缺失类的引用是可行的吗?有没有更好的方法来做到这一点(不,我不愿意考虑套接字或任何类似的东西;我需要.NET和Java之间真正的互操作)?
请求了示例代码:
为清晰起见,删除了jni4net桥代码的示例代码。IA和IB是简单的接口,也不包括在内。
Java:
public class A implements IA
{
public void m1()
{
System.out.println("m1 called");
}
public static void main (String args[])
{
IB b = new B();
b.m2(new A());
}
} C#:
public class B : IB
{
public void m2(IA a)
{
a.m1();
A a2 = new A();
a2.m1();
}
} 发布于 2010-08-05 07:35:11
在Java4中,可以在访问C#对象时使用dynamic关键字。还没有完全尝试过您的方案。一些示例代码会有所帮助。
更新的问题的编辑
你有一个循环依赖,一个编译器可能会抱怨,更不用说两个了。重构到更像下面这样的东西将会有所帮助。当然,在您的实际代码中可能不会那么简单。
// java
public class A implements IA
{
public void m1()
{
System.out.println("m1 called");
}
}
public class MainClass
{
public static void main (String args[])
{
IB b = new B();
b.m2(new A());
}
}
//C#
public class B : IB
{
public void m2(IA a)
{
a.m1();
A a2 = new A();
a2.m1();
}
}https://stackoverflow.com/questions/3410668
复制相似问题