2011-01-10 3 views
0

완전히 독립 실행 형 C++ 프로그램을 컴파일하고 만들고있는 라이브러리가 있습니다. 두 개의 cpp 파일이 있습니다. 하나는 주 파일이고 다른 하나는 모든 기능입니다.기존 C++ 함수를 JNI에 매핑

현재이 프로그램은 args와 함께 Java ProcessBuilder로 구현되어 C++ 프로그램을 호출하고 그 C++ 프로그램의 결과는 단지 파일로 이동합니다.

이제 Java 프로그램으로 그 작업을 수행하는 C++ 함수의 결과를 얻고 싶습니다. (C++ 함수의 결과는 이중 부호없는 문자 배열입니다.)

내 질문은 - 내 Java 프로그램에서 직접 호출 할 수 있도록 기존 라이브러리 함수를 매핑하는 방법이 있으며 여전히 그 사용을 계속합니다. 라이브러리는 독립 실행 형 방식으로 내가 현재 오전, 그 드라이버를 통해 C + + 프로그램 main()?

나는 기본적으로 두 번 같은 라이브러리를 컴파일하는 것을 피하기 위해 노력하고 있어요 - 한 번 JNI 기능에, 한 번 독립형 C++ 프로그램

감사

답변

0

Java Native Access (JNA) 원하는대로 할 수 있습니다.

Java Native Interface (JNI)은 Java와 C++ 사이에 C 글루의 추가 레이어가 필요합니다. 그러나 JNA은 Java에서 직접 일부 C 함수에 액세스 할 수 있습니다.

아마도 함수 extern "C"를 선언해야 할 것입니다. 라이브러리를 다시 컴파일 할 필요는 없지만 C++ 주 기능과 링크해야합니다.

공개 할 대형 C++ 클래스 라이브러리가 있다면 SWIG에 관심이있을 것입니다. 그러나 단일 C 함수의 경우 JNA만으로 충분할 수 있습니다.

0

으로 내가 EXE는 DLL과 비슷한 기능을 내보낼 수 있습니다 생각 (Windows에서 __declspec (dllexport) 사용), 이는 jni-dll과 유사하게로드 할 수 있음을 의미합니다. (당신이 그것을로드하는 데 .dll이나 .so의 이름을 바꾸어야 할 수도 있습니다.)

0

로드가되지 않으면 다른 방법으로 프로그램을 시작하는 것이 좋지만 이것은 Java 프로그램과 일종의 공유 메모리 영역을 설정하는 명령 행 옵션입니다.

이렇게하면 하루를 앞뒤로 복사하는 것을 피할 수 있지만 exe와 java 프로그램 모두에서로드되는 작은 유틸리티 DLL이 필요할 수 있습니다. (쉽게 네이티브 C 호출 O/w 확실하지 자바 설치가 할 수있는 경우 공유 메모리 ..)

(유지 답변 단위를 수락/투표/의견에 대한 별도)

0

를 실행하는 JNI 래퍼 DLL 만들기 실행 가능하며 문자를 리턴합니다. 또는 관련 코드를 정적 라이브러리로 컴파일하고 독립 실행 형 프로그램의 main() 함수 또는 Java에서 호출하기위한 JNI 스텁에 링크합니다. 공정 중 항상 좋습니다.

0

필자는 적절한 방법을 사용하여 함수를 독립적 인 동적 라이브러리 (.dll/.so/.dylib)로 컴파일하는 것이 처음이라고 생각합니다. 는 다음을 수행 할 수 있습니다

  • 은 공유 라이브러리에 연결하는 C++ 실행
  • 예를 들어, C에 결합하는 Java 프로그램 ++ BridJ에 라이브러리 감사 쓰기 (또는, 당신은 평범한 구식에 충실 JNA 경우 쓰기 C)
관련 문제