我有一个名为jniBridge.Calculator的简单Java类,它有一个简单的方法Add(int a,int b)。使用eclipse构建项目后,我将项目导出为JAR文件。
然后我在JAR文件上调用了proxygen,这产生了一个名为clr的文件夹和另一个名为jvm的文件夹,它分别包含C#和Java代理。 Proxygen还创建了build.cmd和.xml文件。
之后我运行了build.cmd,它生成了一个.DLL和.JAR文件。
现在我想在C#中使用这些或其他任何东西,所以我将.DLL和.JAR文件复制到.NET项目文件夹中,并添加了对.DLL文件的引用,并将.JAR文件设置为Copy Always to the输出文件夹,以便它存在于.EXE文件的旁边。我还添加了对Jni4Net主库文件jni4net.n-0.8.8.0.dll的引用,并将其主JAR文件jni4net.j-0.8.8.0.jar复制到同一目录中。添加到转储中,我还添加了我开始使用的原始JAR文件。
在C#Program.cs中,我执行以下操作:
static void Main(string[] args)
{
var bridgeSetup = new BridgeSetup();
bridgeSetup.Verbose = true;
bridgeSetup.AddAllJarsClassPath("./");
bridgeSetup.IgnoreJavaHome = true;
//bridgeSetup.AddAllJarsClassPath(@"C:\Program Files\Java\jre7");
Bridge.CreateJVM(bridgeSetup);
Bridge.RegisterAssembly(typeof(DemoCalc).Assembly);
ICalc calc = new DemoCalc();
int result = calc.MySuperSmartFunctionIDontHaveInJava("Answer to the Ultimate Question of Life, the Universe, and Everything");
Console.WriteLine("Answer to the Ultimate Question is : " + result);
}
但是,最后一次调用失败,出现以下异常:
net.sf.jni4net.jni.JNIException HResult = -2146233088消息=无法加载 来自classLoader的democalc.DemoCalc的java类 sun.misc.Launcher$AppClassLoader@20eb607d来源= jni4net.n-0.8.8.0 StackTrace:在net.sf.jni4net.utils.Registry.LoadClass(String name, ClassLoader classLoader,JNIEnv env)在 net.sf.jni4net.utils.Registry.RegisterClass(RegistryRecord记录, ClassLoader classLoader,JNIEnv env)
请帮助!!
答案 0 :(得分:0)
您需要确保Java包名称正确。在你提到的问题中,你的类被称为jniBridge.Calculator,后来在异常中似乎代理人试图实现一个名为democalc.DemoCalc的类,而在C#harness类中你有这行代码:
Bridge.RegisterAssembly(typeof(DemoCalc).Assembly);
确保正确命名Java包(仅使用小写,如另一个question中所述),并在C#harness中使用相同的包和类名。如果包名为jnibridge,类名为DemoCalc,则C#代码应为:
Bridge.RegisterAssembly(typeof(jnibridge.DemoCalc).Assembly);