java中dll方法的访问
我正在尝试访问用c#编写的java中的dll方法。从下面的代码中,我试图构建成功生成的dlljava中dll方法的访问,java,dll,java-native-interface,Java,Dll,Java Native Interface,我正在尝试访问用c#编写的java中的dll方法。从下面的代码中,我试图构建成功生成的dll using System; using Microsoft.Win32; namespace CyberoamWinHelper { public class RegistryAccess { public static String getValue(String key) { RegistryKey rk =
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的使用是不正确的。在C#库中使用JNI是困难的(尽管并非不可能)。有一个关于如何去做的很好的教程。在谷歌上进行C#JNI搜索将揭示更多信息
你也应该调查一些事情,比如
编辑
是一个很酷的解决方案。如果这些方法实际上是按这种方式设计的,那么您只能通过JNI调用这些方法。你的方法绝对不是。你在这里所做的事情(抱歉这么直截了当地说)绝对没有成功的机会——它根本不这样做 有几种方法可以继续。其中之一就是学习JNI以及如何编写实际使用它的库。是对此的规范引用。不过,用C#实现这一点又增加了一层复杂性 另一种方法是完全放弃JNI,使用更合适的机制来访问这些方法。你可以在这里学习;它会更适合你的目标。试试看。从他们的网站。这里有一些详细的解释->对您有帮助的网站: 尝试:
您需要在上面的链接中描述的C++ DLL中包装DLL。只需用“Java-JNI MyJNI”命令生成头文件,并在其中包含一个函数签名的C++ DLL,就可以找到。
看一看:对于C#中的一个特定的“hello world”示例,您需要使用
System.loadLibrary()
加载您的本机库--最好是静态加载initializer@fge我做到了。它不起作用。你当然知道.NET dll不是标准的dll,它们本身不能与JNI一起工作。@HovercraftFullOfEels:我不明白你想说的。再看一眼。。。您尝试使用JNI,但甚至不尝试让Java和您的本机代码进行通信。没有在Java代码中声明本机方法,没有在本机代码中创建JVM。。。你想达到什么目的?第一个链接不是我想做的。它是关于Visual C++和java的。这是通过JNI完成的,但我想在c#和java之间使用JNI或不使用JNI。在第二个链接中,我的问题也没有答案。JNI与C#没有直接接口。。您必须在C++和JavaOOOH之间创建一个C++存根,我为您找到了一个很酷的解决方案。正如Jayan所说,jni4net很好,但是…@ankur trapasiya-Ernest Friedman Hill的建议绝对正确!请听他说@保罗4:我正试着和JNA一起做。
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());
}
}
}