2010-04-01 11 views
3

JNA를 사용하여 Java에서 액세스하는 사용자 정의 dll이 있습니다. 지금까지 모든 것이 완벽하게 작동하고 있습니다. 이제는 C 코드에서 자바 클래스를 만들고 싶습니다. 나는 이것이 JNA와 함께 할 수 없다고 가정합니다. 그래서 JNI 방법을 만드는 것이 었습니다. 그러나 이것은 UnsatisfiedLinkError의 것으로 인도합니다. 그래서 내 질문은 : 같은 DLL을 액세스 할 때 JNA와 JNI를 혼합 할 수 있습니까? 그렇다면 어떻게해야합니까?JNA와 JNA를 함께 사용할 수 있습니까

+1

는 아마도 또 다른 방법은 다음과 같이 (불투명 포인터 클래스 호출을 포장한다 : http://stackoverflow.com/questions/1873194/jna-calling-methods-upon- c-instance-passed-dll/1881197 # 1881197) –

답변

4

물론 어쨌든 한번만로드되기 때문에 DLL에 대한 액세스를 혼합 할 수 있습니다. 문제는 응용 프로그램에 대한 연결이 작동하는 방법이다 :

JNA :

JNA 당신이 JNA 도서관의 기본 기능을 전화를 사용하는 사용자의 DLL의 기능에 반사 결합의 일종으로. DLL의 함수 이름에 대해 걱정할 필요가 없다는 장점이 있습니다. 모든 규칙을 충족 할 필요가 없습니다.

JNI : DLL을 예상하는 방법 이름으로 자바 클래스의 매핑에 의해

간단한 작동합니다. 당신이 클래스 com.company.SomeClass이 서명 기능 int doStuff(int i, long john)을 포함하는 경우 :

JNIEXPORT jint JNICALL Java_SomeClass_doStuff(JNIEnv *env, jint i, jlong john) { 
    return ...whatever... 
} 

이 기능이없는 경우, 당신은 UnsatisfiedLinkException를 얻을.

솔루션 :

그냥 래퍼 함수로 필요한 기능을 추가, 당신은 완료, 당신이 당신의 자신의 DLL을 쓴 것입니다. 함수 서명을 얻으려면 javah 명령을 사용하여 헤더 파일을 자동으로 만들 수 있습니다.

나는 Advanced Programming for the Java 2 Platform - Chapter 5: JNI Technology을 읽는 것이 좋습니다.

+0

유용하고 유익한 답변 주셔서 감사합니다! –

+0

나는 기본적으로 당신이 묘사 한 것을했는데, 틀린 것을했을 것입니다. 다시 한번 감사 할 것입니다. 고마워요. –

0

내가 할 일을 추가하고 싶습니다. 각 JNIEXPORT에 대해 extern "C"를 잊지 말고 JNA에 대해서도 기능하십시오. 간단한 예를 들어

:

// Example DLL header file MyDLL.dll 
#ifdef MYDLL_EXPORTS 
#define MYDLL_API __declspec(dllexport) 
#else 
#define MYDLL_API __declspec(dllimport) 
#endif 

extern "C" { 
    MYDLL_API void HelloWorld(void);  
} 

extern "C" { 
    JNIEXPORT void JNICALL Java_MyJavaMain_HelloWorld(void); 
} 

//Example CPP file MyDLL.cpp 
#include "MyDLL.h" 
#include "stdio.h" 

extern "C" declspec(dllexport) 

void HelloWorld(void){ 
    printf("Hello World From Dll"); 
} 
관련 문제