2009-12-09 5 views
5
에서 다시 전달 C++ 예에 따라 메소드를 호출

내가 하나의 수출 방법 등과 함께 C++ DLL 말해봐 : 단순히 실제로 메소드를 포함하는 클래스의 인스턴스를 반환 즉JNA DLL

CustomerProcessor* getInstance(); 

를 I 전화해야합니다.

getInstance() 메소드를 JNA (확장 된 com.sun.jna.Library)를 사용하여 Java의 클래스에 매핑 할 수 있음을 알고, 반환 된 CustomerProcessor 인스턴스를 com.sun.jna.Pointer에 저장하십시오.

어떻게하면이 메서드를 CustomerProcessor 클래스에 매핑하여 메서드를 호출 할 수 있습니까? 그렇다면 어떻게 호출 할 수 있습니까?

+0

이 질문에 따라 JNA에서 C++ 메소드를 호출 할 수 없습니다. http://stackoverflow.com/questions/1556421/use-jni-instead-of-jna-to-call-native-code – dfa

답변

2

임의의 type* function() 정의의 경우 JNA를 사용하여 com.sun.jna.Pointer을 반환하는 방법을 매핑 할 수 있지만 JNA의 C++ 객체에 대해 메소드를 호출 할 수는 없습니다.

이 간단한 해결 방법은 개체의 메서드를 호출하는 C 인터페이스 라이브러리를 작성하는 것입니다 ... 일부 멤버 함수 foo()이있는 경우 C++ 코드에서 C 메서드를 내보낼 수 있습니다.

extern "C" void bar(type* var){ 
    var->foo(); 
} 

분명히 이것은 당신을 위해 몇 가지 작업을 추가 할 것입니다 ... 그러나 나는 JNI으로 전환하는 오버 헤드가 거의 같을 것이라고 생각합니다.

+0

사실 저는 이미 C++ 래퍼를 작성하는 길은 사라졌지 만 제거 할 수 있을지 궁금해하고있었습니다. 설명을 해주셔서 감사드립니다. – William

1

JNAerator (http://code.google.com/p/jnaerator/)는 귀하가 요청한 것을 수행하는 것을 용이하게 할 수 있습니다. demangling 및 vtable 액세스를 지원합니다 (*이 메서드를 호출 할 때 필요합니다).