JNI4Net java in c#,JNIException

时间:2015-08-21 11:10:49

标签: java c# jni4net

我有一个名为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)

请帮助!!

1 个答案:

答案 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);