2011-11-28 58 views
2

我有一个C#类,其中一个方法编译为本机代码,我想使用JNA从Java方法调用。该类被封装为一个名为DataGrabber.dll的文件。 这是C#代码:使用JNA访问编译为Java本地代码的C#方法

namespace GrabberLibrary { 
    public class Grabber { 
     public void GetData(String projectId, String importURI){ 
      //implementation code 
     } 
    } 
} 

我已经实现了接口的建议:

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中调用这个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. 

在另一方面,如果我把它作为命名空间中的C#代码(DataGrabber)定义我得到相同的DLL名称:

java.lang.UnsatisfiedLinkError: Error looking up function 'GetData': The specified procedure could not be found. 

我如何可以调用GetData方法?

+2

你用什么编译器来实现这个?据我所知,C#编译器将不会编译为本机代码。 – GeirGrusom

+0

.Net Reactor(http://www.eziriz.com/dotnet_reactor.htm) – Neman

+0

我对编译器的工作原理知之甚少,但试试这个: - 将函数标记为静态 - 检查如何执行DLL导出.NET Reactor - 使用Dependancy Walker查看输出 – GeirGrusom

回答