2013-08-02 2 views
0

나는 에서 호출 할 타사 VB.Net dll을 갖고 있습니다.VB.Net dll 클래스 및 하위 함수 호출, JNA 함께 Java

VB.Net dll은 (... 의사 코드,하지만 자바 같은 느낌) 다음 서명이 :

class MyClass1 { 
    public Object method1(StringRef arg1, StringRef arg2) { 
     // do something here... 
     return someResult; 
    } 
} 
class MyClass2 { 
    public Object method2(StringRef arg1, StringRef arg2) { 
     // do something here... 
     return someOtherResult; 
    } 
} 

참고 :StringRef는 방법을 말하는 내 방식 날에 통과 할 것으로 예상입니다 참조 문자열.

Java에서이 DLL 객체를 호출하려고합니다. JNA를 사용하면 다음과 같은 결과를 얻을 수 있습니다.

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

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

    public static interface MyClass1 { 
     public Object method1(String arg1, String arg2); 
    } 
    public static interface MyClass2 { 
     public Object method2(String arg1, String arg2); 
    } 
} 

INSTANCE 개체는 잘로드됩니다. 그러나, 나는 DllName의 몸체가 DLL의 클래스 메소드 메쏘드에 매핑하기 위해 취해야하는 구조를 알아 내지 못합니다. 또한 객체를 직접로드하는 방식으로 Native을 호출하는 방법을 알지 못했습니다. 예를 들어, 내가 할 경우 : DLL이 DllName라는부터

DllName INSTANCE = (DllName)Native.loadLibrary("DllName.MyClass1", DllName.class); 

이것은 UnsatisfiedLinkError 발생합니다. 이 호출을하려면 위와 다른 인터페이스가 필요합니다.

질문 :

  1. 이도 가능합니까? 예 : 위의 구조에서 JNA를 사용하여 Java에서 VB.Net dll을 호출 할 수 있습니까?
  2. MyClass1MyClass2 클래스에 올바르게 매핑하려면 DllName 구조가 필요합니까? 이것이 내 핵심 질문입니다.
  3. 위의 DllName.MyClass1 호출에서 대체 방법이 있습니까?
  4. 아래에 언급 된 대안 항목 중 하나라도 놓친 적이 있습니까? 아마도 내가 놓친 다른 해결책이 있을까요?

나는 다음과 같은 대안 탐험 :

  1. this article을 검토,하지만 내 구조와 일치하는 예를 보지 못했다. 또한 하단에 언급 된 단위 테스트를 살펴 보았습니다.
  2. 여기에/questions/1556421/use-jni 대신 jna-to-call-native-code (나는 링크로 게시 하겠지만 SO와 충분한 명성은 아닙니다.) 제안 된 C++ 래퍼 만들기). C++에 익숙하지 않아서 실제로 이것을 시도하지 않았습니다. 자바 코드를 약간 변경하면 충분하다고 생각할 때 나는 너무 많이 부딪 힐 것이다.
  3. JNI : 이것은 C/C++ 유형 dll 전용 인 것처럼 보입니다.
  4. javOnet : 거의 작동하지만, VB.Net 메소드는 현재 javahnet에서 지원하지 않는 참조로 문자열을 예상합니다. 나는 그 문제를 그들에게보고했고, 나는 해결책을 기대한다. 그것이 작동하더라도 JNA 솔루션이 작동해야하는 것처럼 보입니다. 또한이 솔루션에는 비용 문제가 있습니다.
  5. jni4net : 제 3 자 dll이므로 나에게 적합하지 않습니다. jni4net은 .Net 쪽에서 약간의 훅을 기대합니다.

여기에 추가 색상을 추가하려면 알려주십시오.

+0

JNA는 여기에서자를 예정이 아닙니다. 이것은 아마도 COM 인터페이스를 내보내므로 [JACOB] (http://sourceforge.net/projects/jacob-project/)을 시도해 보셨습니까? –

답변

0

javOnet은 버전 1.2 이후 ref 또는 out에 의해 전달 된 인수에 대한 지원을 이미 제공합니다. http://www.javonet.com/quick-start-guide/#Passing_arguments_by_reference_with_ref_and_out_keywrods

메서드 호출 내에서 업데이트 할 수 있도록 JAVA 형식을 "AtomicReference"로 포장해야하며 JAVA 변수는 .NET 측에서 정수가 자동으로 수정된다고 가정 해 봅니다. 아래의 사용 샘플을 볼 수 있습니다.

NObject refEx = Javonet.New("RefExample"); 
//Wrap Java integer in AtomicReference to allow passing by reference 
AtomicReference<Integer> myInt = new AtomicReference<Integer>(10); 

refEx.invoke("Method",new NRef(myInt)); 

System.out.println(myInt.get()); 
//Output will display number "55" because int passed by reference has been modified within the method body.