2014-03-27 61 views
1

我是使用JNA从Java访问DLL的新手。我需要从DLL中的类(以.net写成)访问类中的方法。在下面构建这个示例DLL,我试图获取AuditID和Server ID。我正在运行我的代码时以下列错误结束。任何指导真的很感激。使用JNA从Java调用DLL

///错误///

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'GetEnrollcontext': The specified procedure could not be found. 

// DLL文件中的代码//

SampleDLL.ProfileEnroll enrollcontext = new SampleDLL.ProfileEnroll(); 
enrollcontext.Url =” url”; 
enrollcontext.AuditIdType = SampleDLL.ProfileId; 
enrollcontext.AuditId = “22222222 “; 
enrollcontext.ServerId = “server1”; 

/// Java代码的///

import com.sun.jna.Library; 
import com.sun.jna.Native; 
import com.sun.jna.Structure; 
import dllExtract.DLLExtractTest.SampleDLL.Enrollcontext; 


public class SampleDLLExtract { 

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

     public static class Enrollcontext extends Structure { 

      public String auditId; 
      public String serverId; 
     } 
      void GetEnrollcontext(Enrollcontext ec);      // void(); 
    } 
    public static void main(String[] args) { 
     SampleDLL sdll = SampleDLL.INSTANCE; 
     SampleDLL.Enrollcontext enrollContext = new SampleDLL.Enrollcontext(); 
     sdll.GetEnrollcontext(enrollContext); 

     System.out.println(sdll.toString(sdll.GetEnrollcontext(enrollContext))); 
    } 
} 
+0

经过大量研究,确认无法使用JNA框架调用VB或C Sharp编码的DLL文件。 JNA正在使用System DLL,但不适用于第三方DLL。 – SamK

回答

2

其实有是一种解决方案,可以通过JNA在Java中使用C#,VB.NET或F#代码(除此之外)!而且它也很容易使用: https://www.nuget.org/packages/UnmanagedExports

本包装所有你需要做的是,添加[RGiesecke.DllExport.DllExport]你的方法,这样的:

C#的.dll项目:

Java项目:

public interface jna extends Library { 
    jna INSTANCE = (jna) Native.loadLibrary("yourCSharpProject.dll", jna.class); 
public String yourFunction(String yourParameter); 
} 

使用它的代码:

System.out.println(jna.INSTANCE.yourFunction("nothingImportant")); 

中提琴!

前面已经提到它的工作原理很简单,但这种方法有一定的局限性:

  • 只适用于简单的数据类型作为参数&返回值
  • 没有可用MethodOverloading。 yourFunction(String yourParameter)和yourFunction(String yourParameter,String yourSecondParameter)不起作用!您必须以不同的方式命名它们
  • 使用数组作为参数或返回值。 (JNA提供了StringArray,但我不能在C#中使用它们)(也许有一种解决方案,但是我不能拿出一个到目前为止!)
  • 如果你导出的方法你不能调用它内部在你的C#代码(简单的由下绕过:

[RGiesecke.DllExport.DllExport] 
public static Boolean externalAvailable(String yourParameter) 
{ 
    return yourInternalFunction(yourParameter); 
} 

用C#它的伟大工程,具有VB.NET和F#我没有经验 希望这会有所帮助!

+0

感谢您的详细解答。我经历了jn14net(http://jni4net.sourceforge.net/)文档,并想尝试一下。你有什么建议吗? – SamK

+0

对jni4net的建议?不是一般的,对不起。 基本样本看起来不错,但idk如何与其他类一起使用它们,然后将c#类包含在jni4net.version.jar中 – Hansa