JNA를 사용하여 Java에서 액세스하는 사용자 정의 dll이 있습니다. 지금까지 모든 것이 완벽하게 작동하고 있습니다. 이제는 C 코드에서 자바 클래스를 만들고 싶습니다. 나는 이것이 JNA와 함께 할 수 없다고 가정합니다. 그래서 JNI 방법을 만드는 것이 었습니다. 그러나 이것은 UnsatisfiedLinkError의 것으로 인도합니다. 그래서 내 질문은 : 같은 DLL을 액세스 할 때 JNA와 JNI를 혼합 할 수 있습니까? 그렇다면 어떻게해야합니까?JNA와 JNA를 함께 사용할 수 있습니까
답변
물론 어쨌든 한번만로드되기 때문에 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을 읽는 것이 좋습니다.
유용하고 유익한 답변 주셔서 감사합니다! –
나는 기본적으로 당신이 묘사 한 것을했는데, 틀린 것을했을 것입니다. 다시 한번 감사 할 것입니다. 고마워요. –
내가 할 일을 추가하고 싶습니다. 각 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");
}
- 1. JNA를 통해 Java에서 COM을 사용할 수 있습니까?
- 2. JNA와 EnumWindows를 사용하여 문제가 발생했습니다.
- 3. 클래스와 함께 사용할 수 있습니까?
- 4. inetAddress를 inet6/IPv6와 함께 사용할 수 있습니까?
- 5. require_once를 심볼릭 링크와 함께 사용할 수 있습니까?
- 6. WebBrowser 컨트롤과 ServicePointManager를 함께 사용할 수 있습니까?
- 7. AsyncFileUpload를 UpdatePanel과 함께 사용할 수 있습니까?
- 8. Ruby와 Python을 함께 사용할 수 있습니까?
- 9. jQuery를 Ext.js와 함께 사용할 수 있습니까?
- 10. Windows 컨트롤을 WPF와 함께 사용할 수 있습니까?
- 11. 람다 함수와 함께 사용할 수 있습니까?
- 12. subsonic3과 Moq를 함께 사용할 수 있습니까?
- 13. Express와 함께 batman.js를 사용할 수 있습니까?
- 14. d : DataContext와 함께 XmlDataProvider를 사용할 수 있습니까?
- 15. subethasmtp를 접미사와 함께 사용할 수 있습니까?
- 16. 장고는 무엇입니까? jsf와 함께 사용할 수 있습니까?
- 17. 시안과 얼라이드는 함께 사용할 수 있습니까?
- 18. EF4를 sp_msforeachdb와 함께 사용할 수 있습니까?
- 19. Sinatra를 IronRuby와 함께 사용할 수 있습니까?
- 20. Ajax HTTP와 HTTPS를 함께 사용할 수 있습니까?
- 21. 여러 개의 "함께"사용할 수 있습니까?
- 22. vim을 마우스와 함께 사용할 수 있습니까
- 23. 로거가 php codeigniter와 함께 사용할 수 있습니까?
- 24. BeginInvoke를 MulticastDelegate와 함께 사용할 수 있습니까?
- 25. RegAsm을 실행 파일과 함께 사용할 수 있습니까?
- 26. ExtJS와 함께 jQuery ThemeRoller를 사용할 수 있습니까
- 27. CGMainDisplayID()를 iOS와 함께 사용할 수 있습니까?
- 28. 누구나 explorercanvas를 GWT와 함께 사용할 수 있습니까?
- 29. DokuWiki와 jQuery를 함께 사용할 수 있습니까?
- 30. iBATIS.NET과 ICollection을 함께 사용할 수 있습니까? 나는
는 아마도 또 다른 방법은 다음과 같이 (불투명 포인터 클래스 호출을 포장한다 : http://stackoverflow.com/questions/1873194/jna-calling-methods-upon- c-instance-passed-dll/1881197 # 1881197) –