2009-05-10 1 views
3

자바 코드에서 정적 윈도우 라이브러리 (*.lib)를 사용해야하는데, C++ JNI 래퍼를 쓸 수는 있습니다. C++에서 경험 한).최소한의 노력으로 Java 코드의 Windows 정적 라이브러리를 사용하십시오. (아마도 JNA를 사용합니다.)

가장 쉬운 (최소 개발 노력) 방법은 성능을 중요시하지 않는 것입니다. 그 코드는 단지 일부 데이터를 가져 오기 때문에 Java 측에서 가장 잘 수행 될 것입니다.

아마도 대부분 JNA을 사용할 것이지만 AFAIK에는 동적 라이브러리가 필요하며 정적 라이브러리가 필요합니다.

또한 asked question 정적 라이브러리를 동적 라이브러리로 변환 할 때.

답변

2

가치가있는 것을 위해, 나는 잠시 뒤의 프로젝트를 가지고 있었다. JNI 랩퍼를 자동 생성하는 것은 꽤 쉬웠습니다. 나는 우리가 약 350 개의 함수 수출을 포장했다고 생각한다. 래퍼를 자동으로 생성하는 스크립트를 작성하는 데 약 3 시간이 걸렸습니다 (미안하지만 스크립트를 편리하게 배치하거나 게시하지 마십시오).

우리는 C++ 코드를 거의 작성하지 않았지만 JNI의 작동 방식을 이해해야합니다. 실제로는 꽤 좋은 학습 기회/프로젝트입니다. 시간이 있다면 JNI를 두려워하지 마십시오. JVM이 어떻게 작동하는지 배울 때 얼마나 놀랍습니까?

이 경로를 사용한다면 래퍼 함수를 ​​실제로 가볍게 유지하는 것이 좋습니다. 필요한 인수를 JNI 값에서 네이티브 (이것은 주로 문자열에 필요합니다)로 변환하고 네이티브 함수를 호출 한 다음 결과를 다시 변환하십시오.

문자열 포인터를 전달하고 해당 문자열이 포인터로 돌아올 것으로 예상되는 경우 자바 측에서 크기 1 인 문자열 배열을 사용하고 기본 호출의 결과를 채 웁니다. 당신이 시간을 누를 경우

또는, .DLL에 lib 디렉토리를 컴파일하고

3

정적 라이브러리에 직접 호출 할 수있는 DLL (동적 라이브러리) 프로젝트를 만들면 JNA에 새로 생성 된 DLL을 사용할 수 있습니다.

+1

예 내가 할 수 :-) JNA를 사용하지만, 난 아주 많이 자바에서 directrly 전체 물건을 호출 선호하는 것입니다. . . 더 빨리 실험 할 수있게 해줄 것입니다. 내가 사용하는 라이브러리는 수백 가지 기능이 혼란 스럽기 때문에 전체 래퍼를 작성하는 것은 옵션이 아니며 조금씩 수행하는 것도 고통이 될 것입니다. –

+1

JNI를 제안하지 않으므로 래퍼에 복잡한 내용을 쓸 필요가 없습니다. 실제로는 헤더의 모든 함수에 _declspec (dllexport)라는 접두사를 붙이고 (간단히 편집기의 search-replace로 수행 할 수 있음) DLL 프로젝트로 빌드 한 다음 DLL을 제공해야합니다. – Francis

+0

감사합니다. –

관련 문제