我有一个名为jniBridge.Calculator的简单Java类,它有一个简单的方法Add(int,int )。在使用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.utils.Registry.LoadClass(String =-2146233088 net.sf.jni4net.jni.JNIException =-2146233088 Message=无法从classLoader sun.misc.Launcher$AppClassLoader@20eb607d Source=jni4net.n-0.8.8.0 StackTrace加载democalc.DemoCalc java类:在sun.misc.Launcher$AppClassLoader@20eb607d name,ClassLoader classLoader,JNIEnv env)在sun.misc.Launcher$AppClassLoader@20eb607d record,ClassLoader classLoader,JNIEnv env)
请帮忙!!
发布于 2016-01-19 00:20:47
您需要确保Java包名是正确的。在前面提到的问题中,您的类名为jniBridge.Calculator,在例外情况下,代理似乎试图实例化一个名为democalc.DemoCalc的类,而在C#工具类中,您有以下代码:
Bridge.RegisterAssembly(typeof(DemoCalc).Assembly);确保您正确地命名了Java (使用小写,就像在另一个question中提到的那样),并在您的C#工具中使用相同的包和类名。如果包名为jnibridge,并且类名为DemoCalc,那么C#代码应该是:
Bridge.RegisterAssembly(typeof(jnibridge.DemoCalc).Assembly);https://stackoverflow.com/questions/32138826
复制相似问题