2013-09-06 2 views
0

내 목표는 동일한 SQLite 데이터베이스에서 읽은 두 개의 개별 응용 프로그램 (Java에서 하나, C++에서 둘 다 동일한 시스템에 있음)을 만드는 것입니다. C++ 구현은 이미 작동하며 해당 통신에 필요한 모든 메소드를 갖추고 있습니다. sqlite3.h 라이브러리를 사용합니다.Java와 C++ 사이의 IPC

Java 응용 프로그램에서 JDBC 또는 SQLite 랩퍼를 사용하는 것이 가장 합리적입니다. 문제는 내 임베디드 시스템 (POSIX)에 리소스가 매우 제한되어 있고 필요한 * .jar 파일을 포함 할 때 간단한 쿼리를 실행하는 데 너무 오래 걸리는 것입니다. Xerial JDBC, sqlite4java, sqljet 및 Javasqlite Wrapper/JDBC 드라이버를 Christian Werner에서 사용해 보았습니다. JavaVM은 모든 것을로드하고 실행하는 데 너무 오래 걸리고 성능은 중요한 문제입니다.

해결 방법으로, 시스템 명령을 사용하고 쿼리를 실행하고 대답을 얻기 위해 sqlite3 명령 셸을 실행하도록 Java 응용 프로그램을 관리했습니다. 더 세련되고 안전한 솔루션을 찾고 있습니다.

실제로 C++의 메소드를 사용하려면 Java 응용 프로그램이 필요합니다. 메서드가 구현되어 하나의 값만 반환하도록 문자열을 반환합니다. IPC를 많이 읽은 후에 나는 명명 된 파이프를 사용해야한다는 결론에 도달했습니다. 것은 내가 JNI를 사용해야 만 할 것이지만 초급 자바 레벨을 가지고 있으며 이번에 JNI는 너무 복잡합니다. 이 경우에 JNI는 과도한 행동입니까?

여기에 구현할 수있는 다른 해결책은 무엇입니까?

+0

어쩌면 당신이 여기서 뭔가를 찾을 수 있습니다 : http://stackoverflow.com/q/165945/2617699 여기에 http : // 유래 .com/q/5900887/2617699 – JavaDM

+0

JNI는 내가 선호하는 간단하고 직선적 인 방법입니다. 또한 파이프 대신 소켓 (UDP/TCP) 또는 공유 메모리를 사용할 수 있습니다. – deepmax

답변

0

사실 내가 틀 렸습니다. Java에서 명명 된 파이프를 사용하기 위해 JNI를 사용할 필요가 없습니다. 나는이 두 과정을 기본 기술을 사용하여 성공적으로 전달했다. 자바에서는 그냥 FileOutputStream과 FileInputStream을 사용하여 명명 된 파이프와 통신합니다.

이 링크 나에게 특별히 유용 :

http://carminedimascio.com/2014/01/named-pipes-with-java/

2
당신은 IPC를 통해 필요한 성능 확실하지

하지만 몇 가지 방법이 있습니다 : (당신이 성능 향상이있을 것이다 memorymappedfiles 사용)

  1. 사용 소켓
  2. 사용 파이프
  3. 사용 memorymappedfiles

두 경우 모두 java에서 C++ 및 viceversa로 전달하는 객체 (데이터)에 대한 serializer/deserializer가 필요합니다.

데이터 형식에 따라 Java 측에서만 serializer/deserializer가 필요할 수 있습니다. (예를 들어 C++에서 더 이상 디코딩 할 필요없이 읽을 수있는 바이너리 데이터를 보낼 수 있습니다). Java에서 메모리 맵핑 된 파일을 사용하는 방법에 대한 좋은 자습서는 here이고 C++에서는 mmap 함수를 사용해야합니다.

0

swig을 사용할 수 있습니다. Swig는 C/C++ 헤더를 파싱하고 그로부터 Java clases/function을 생성 할 수 있습니다. 생성 된 코드는 j ++ 호출을 사용하여 C++ 클래스 나 c 함수를 호출합니다.

+0

제가 살펴 보겠습니다. 결코 들어 본 적이 없지만 아주 흥미로 웠습니다. – Nacao

관련 문제