2014-03-27 1 views
1

JNA를 사용하여 Java에서 DLL에 액세스하는 것이 처음입니다. .NET에서 작성된 DLL 내의 클래스에서 메소드에 액세스해야한다. 이 샘플 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”; 

/// 자바 코드 ///

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는 시스템 DLL로 작업하지만 타사 DLL에는 적합하지 않습니다. – SamK

답변

2

JNNA를 통해 C#, VB.NET 또는 F # 코드를 Java 용으로 사용할 수있는 솔루션입니다.

C#을 .DLL 프로젝트 : 당신이 할 필요가, 그런 당신의 방법에 [RGiesecke.DllExport.DllExport] 추가되어 https://www.nuget.org/packages/UnmanagedExports

이 패키지 : 사용하는 것도 매우 쉽습니다

자바 프로젝트 :

: 코드의

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 (yourParameter String) 및 yourFunction (yourParameter, String yourSecondParameter String)이 작동하지 않습니다! 다르게 이름을 지정해야합니다.

  • 배열을 매개 변수 또는 반환 값으로 사용하십시오. (JNA StringArray를 제공하지만 C#에서 그들을 사용할 수 없습니다 (어쩌면 해결책이 있지만 지금까지 하나 올 수 없어!)
  • 당신이 그것을 호출 할 수없는 메서드를 내보낼 경우 그 다음으로 우회 내부적으로 C# 코드에서 (단순 :.

는 VB.NET과 F #과 함께 좋은 작품을 C 번호와

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

나는 아무 경험이 도움이 희망을.!

+0

자세한 답변 해 주셔서 감사합니다. 나는 jn14net (http://jni4net.sourceforge.net/) 문서를 통해 시도해보고 싶다. 충고 하나있어? jni4net에 대한 – SamK

+0

님의 조언이 있으십니까? 미안하다. 기본 샘플이 멋지지만 idk에서 다른 클래스와 함께 사용하는 방법, jni4net.version.jar에 이미 포함되어있는 C# 클래스를 사용하는 방법 – Hansa