在java中访问dll方法

我正在尝试访问用c#编写的java中的dll方法。 从下面的代码我试图建立成功生成的DLL。

using System; using Microsoft.Win32; namespace CyberoamWinHelper { public class RegistryAccess { public static String getValue(String key) { RegistryKey rk = Registry.CurrentUser; RegistryKey rk1=rk.OpenSubKey("Software\\Test", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl); rk1.SetValue(key, "val1"); return rk1.GetValue(key).ToString(); } public static void createSubkey(String name) { RegistryKey rk = Registry.CurrentUser; rk.CreateSubKey("Software\\Test"); } } } 

在此之后我在我的java程序代码中加载生成的dll,如下所示

 public class JNI { /** * @param args the command line arguments */ public native String getValue(String key); public static void main(String[] args) { // TODO code application logic here try { System.loadLibrary("CyberoamWinHelper"); JNI j=new JNI(); System.out.println(j.getValue("abc")); } catch(UnsatisfiedLinkError e) { System.out.println("Ex" + e.getMessage()); } } } 

运行此代码后,它给我以下错误。

 "Exjni.JNI.getValue(Ljava/lang/String;)Ljava/lang/String;" 

好吧,我不明白这个错误是什么,但我想解决它。 我还有一个问题是,因为我调用的方法是一个静态方法,它会以这种方式调用吗? 我的意思是调用我们需要的静态方法

“classname.methodname”

所以这里可以调用方法吗?

如果这些方法实际上是设计为以这种方式调用,那么你只能通过JNI调用方法。 你的方法绝对不是。 你在这里做的事情(抱歉这么直率)绝对没有机会成功 – 它根本不起作用。

有几种方法可以继续。 一个是学习JNI以及如何编写实际使用它的库。 以下是此规范的参考资料。 但是,使用C#执行此操作会增加另一层复杂性。

另一种方法是完全放弃JNI并使用更合适的机制来访问这些方法。 你可以在这里了解JNA ; 它会更适合你的目标。

试试jni4net 。 从他们的网站。 这里有一些详细的解释 – > 从Java到.NET的调用如何在jni4net中运行

您对JNI的使用不正确。 将JNI与C#库一起使用很困难(尽管不是不可能)。 有一个关于如何在这里进行的优秀教程。 在谷歌上进行C#JNI搜索会发现更多信息。

你还应该调查像Grasshopper这样的东西..

编辑

http://caffeine.berlios.de/site/documentation/quickstart.html

是一个很酷的解决方案

有用的网站: http : //www.sahirshah.com/java/jni.html

尝试:

 public class myJNI { /** * @param args the command line arguments */ public static native String getValue(String key); static { System.loadLibrary("CyberoamWinHelper"); } public static void main(String[] args) { // TODO code application logic here try { String myKey = "abc"; System.out.println(getValue(myKey)); } catch(UnsatisfiedLinkError e) { System.out.println("Ex" + e.getMessage()); } } } 

您需要将dll包装在c ++ dll中,如上面的链接所述。 只需使用“javah -jni myJNI”命令生成头文件,并使用该头文件中的函数签名构建一个c ++ dll。

请查看: http : //www.codeproject.com/KB/cross-platform/javacsharp.aspx,了解C#中特定的“hello world”示例