我正在尝试访问用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”
所以这里可以调用方法吗?
答案 0 :(得分:7)
如果这些方法实际上是设计为以这种方式调用,那么你只能通过JNI调用方法。你的方法绝对不是。你在这里做的事情(抱歉这么直率)绝对没有机会取得成功 - 它根本不起作用。
您可以通过多种方式继续进行。一个是学习JNI以及如何编写实际使用它的库。 Here是对此的规范参考。但是,使用C#执行此操作会增加另一层复杂性。
另一种方法是完全放弃JNI并使用更合适的机制来访问这些方法。你可以在这里了解JNA;它完全更适合你的目标。
答案 1 :(得分:1)
试试jni4net。从他们的网站。这里有一些详细的解释 - > How calling from Java to .NET works in jni4net
答案 2 :(得分:0)
您对JNI的使用不正确。将JNI与C#库一起使用很困难(尽管不是不可能)。有一个关于如何实现它的优秀教程here。在谷歌上进行C#JNI搜索会显示更多内容。
您还应该调查类似Grasshopper ..
http://caffeine.berlios.de/site/documentation/quickstart.html
是一个很酷的解决方案。
答案 3 :(得分:0)
有用的网站: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”示例