使用JNA访问从Java编译为本机代码的C#方法

使用JNA访问从Java编译为本机代码的C#方法,c#,java,jna,C#,Java,Jna,我有一个C#类,其中一个方法编译为本机代码,我想用它从Java方法调用。该类作为dll打包在名为DataGrabber.dll的文件中。 这是C代码: 我已经按照建议实现了接口: import com.sun.jna.Library; import com.sun.jna.Native; public interface Grabber extends Library{ Grabber INSTANCE = (Grabber)Native.loadLibrary("Grabber",

我有一个C#类,其中一个方法编译为本机代码,我想用它从Java方法调用。该类作为dll打包在名为DataGrabber.dll的文件中。 这是C代码:

我已经按照建议实现了接口:

import com.sun.jna.Library;
import com.sun.jna.Native;

public interface Grabber extends Library{
    Grabber INSTANCE = (Grabber)Native.loadLibrary("Grabber", Grabber.class);

    void GetData(String projectId, String importURI);
}
然后当我从Java中的main方法调用这个GetData方法时,如下所示:

System.setProperty("jna.library.path", "C:\\dlls");
Grabber sgl = Grabber.INSTANCE;
sgl.GetData("123", "http://localhost/test");
我得到以下例外情况:

java.lang.UnsatisfiedLinkError: Unable to load library 'Grabber': The specified module could not be found.
另一方面,如果我将dll的名称与C#code(DataGrabber)中定义的名称空间相同,我会得到:


如何调用GetData方法?

我认为您试图在错误的位置加载DLL文件,它应该在main方法中。
请看这里:

我认为您试图在错误的位置加载DLL文件,它应该在main方法中。
请看这里:

您使用什么编译器来实现这一点?据我所知,C#编译器在任何时候都不会编译成本机代码..Net Reactor(),我对编译器的工作原理知之甚少,但请尝试以下操作:-将函数标记为静态-检查如何在.NET Reactor中进行DLL导出-使用Dependency WalkerMaybe检查输出,因为编译器已混淆代码,现在它有了其他名称。代码未混淆。同样需要注意的是,当我给出要加载的名称空间的名称(与dll的名称相同)时,它没有问题,但我不知道如何调用该方法。您使用什么编译器来实现这一点?据我所知,C#编译器在任何时候都不会编译成本机代码..Net Reactor(),我对编译器的工作原理知之甚少,但请尝试以下操作:-将函数标记为静态-检查如何在.NET Reactor中进行DLL导出-使用Dependency WalkerMaybe检查输出,因为编译器已混淆代码,现在它有了其他名称。代码未混淆。还需要注意的是,当我给出要加载的名称空间的名称(与dll的名称相同)时,它没有问题,但是我不知道如何调用该方法。
java.lang.UnsatisfiedLinkError: Unable to load library 'Grabber': The specified module could not be found.
java.lang.UnsatisfiedLinkError: Error looking up function 'GetData': The specified procedure could not be found.