0

我有一个名为 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 文件设置为始终复制到输出文件夹,所以它与 .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 sun.misc.Launcher$AppClassLoader@20eb607d 为 democalc.DemoCalc 加载 java 类 Source=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 record, ClassLoader classLoader, JNIEnv env)

任何帮助请!

4

1 回答 1

0

您需要确保 Java 包名称正确。在您提到的问题中,您的类称为 jniBridge.Calculator,后来在异常中,代理似乎正在尝试实例化一个名为 democalc.DemoCalc 的类,并且在 C# 线束类中,您有这行代码:

Bridge.RegisterAssembly(typeof(DemoCalc).Assembly);

确保正确命名 Java 包(仅使用小写,如另一个问题中所述),并在 C# 工具中使用相同的包和类名。如果包名为 jnibridge,类名为 DemoCalc,则 C# 代码应为:

Bridge.RegisterAssembly(typeof(jnibridge.DemoCalc).Assembly);
于 2016-01-19T00:20:47.440 回答