문제

배경 : 우리는 많은 데이터 분석을 수행 할 물리 앱을 설계하고 있지만 우리의 초점은 물리 전자 장비를 통합하는 것입니다.

기본적으로 나는 전화 할 수 있기를 원합니다 뿌리 (C ++로 작성된 CERN의 빅 데이터 분석 라이브러리입니다) Java의 C ++ 라이브러리로 작성되었습니다. 기본적으로 Java의 루트 클래스를 사용하는 능력 (그리고 JNI 래퍼에 많은 시간을 잃지 않고 수행하는 것은 우리에게 쇼 토퍼입니다.

다음 방법을 생각할 수 있습니다

  • JNI- 내가 말했듯이 - 우리는 모든 수업에 대한 포장지를 쓰고 싶지 않습니다. . .
  • JNA -JNA는 C ++ 매핑을 제공하지 않고 C 만 제공합니다.
  • 통음 - 나는 그것을 사용하지 않았지만 사용하기 어렵다고 들었습니다.

계시가 될 수있는 다른 것들 : 루트 소스 코드에 액세스 할 수 있지만 변경하고 싶지는 않습니다. 우리는 결과가 휴대하기를 원합니다. 우리는 무료 라이브러리를 고수하고 싶습니다. 그리고 내가 말했듯이 - 우리는 처음부터 소란없이 많은 루트 코드를 사용할 수있을 것입니다.

도움이 되었습니까?

해결책

어떤 선택이든, 당신은 약간의 포장을해야합니다. 모든 클래스에 대해 JNI 래퍼를 쓰고 싶지는 않지만 메소드 그룹을 포함하는 더 높은 레벨 C ++ 클래스를 작성할 수 있습니다. 그런 다음 더 높은 수준의 클래스에 대한 랩퍼 만 작성하면됩니다 (이 접근법은 JNI뿐만 아니라 다른 방법에도 적용됩니다).

다른 팁

STDIN에서 입력을 읽고 STDOUT에 출력을 작성하는 작은 C ++ 응용 프로그램을 작성하십시오. 그런 다음 Java 앱 내에서 프로세스를 실행하고 stdout의 출력을 읽으십시오.

이것은 JNI없이 그것을하는 가장 좋은 방법입니다 (그리고 매우 쉽습니다).

추천합니다 Dropbox의 Djinni 인터페이스 생성 도구. 크로스 플랫폼 모바일 앱에 사용하여 Java (Android)와 IOS (객관적인 C) 인터페이스와 C ++ 데이터 모델 사이의 인터페이스를 생성합니다.

Facebook도 사용했습니다 그들의 앱 중 하나를 위해. 그래서 나는 꽤 잘 테스트되어 있다고 생각합니다.

CPPCON에서 그들의 대화를 참조하십시오 그것이하는 일에 대한 개요. JNI를 사용하여 Java와 C ++ 간의 인터페이스는 특히 오류가 발생하기 쉬운 것으로 보입니다.

Jnieasy C ++ 클래스를 Java Pojo 클래스에 매핑하는 것을 지원하지만 399 유로 비용이 듭니다. 무료 라이브러리를 선호하기 때문에 Corba와 같은 솔루션을 찾고 싶을 수도 있습니다. C ++ 클래스를 Java 클래스에 매핑하는 유일한 방법입니다.

편집 : 고려해 왔습니다 JAS3, 그것은 루트와 비슷한 자바 라이브러리입니까?

단지 생각이지만 루트가 이미 지원하기 때문에 Python을 사용할 수 있습니까? Java의 코드를 포장하는 데 걸리는 시간에 합리적으로 능숙해질 수 있습니다.

Java 대신 C#을 사용하는 것을 고려하십시오. 이미 Java에 익숙하다면 C#으로 전환하는 것은 쉽고 훨씬 더 나은 지원 기본 코드를 호출합니다.

C ++에 필요한 클래스/기능을 작성하고, 컴파일 및 Java에서 exec ()를 호출하는 것은 어떻습니까?

JNI를 통해 Java에서 C 또는 C ++ 코드를 호출 할 때마다 C/C ++ 측의 메모리 관리 및/또는 스레드 안전 문제로 인해 Java 플랫폼을 불안정화 할 위험이 있습니다.

JNI 등을 내려 가기 전에 다른 대안을 고려해야한다고 생각합니다.

  • Java를 방정식에서 꺼내고 C ++ (또는 다른 사람이 제안한대로 C ++ / CC#)로 완전히 구현하십시오.
  • 기본 라이브러리를 사용하여 수행 해야하는 작업을 수행하는 C ++ 명령 줄 애플리케이션을 작성하고 중 하나를 사용하여 응용 프로그램을 실행하십시오. java.lang.Runtime.exec 행동 양식.
  • 사용자 정의 프로토콜로 필요한 기능을 노출시키는 라이브러리의 C ++에 "서버"래퍼를 작성하고 Java 측을 코딩하여 HTTP, 원시 소켓, 파이프 또는 전송 수준을 사용하여 서버와 통신하십시오.

대안에는 모두 단점이 있지만 JNI / JNA 등도 마찬가지입니다. 첫 번째 단락을 참조하십시오.

편집 : 시스템에서 JNI / JNA를 사용하기로 결정하면 장기적인 결과가있을 수 있습니다. 안정성 문제 외에도 휴대 성 (Windows, Linux 등의 기본 라이브러리가 작동 함), 문제를 구축하기가 어렵습니다 (개미에서 기본 라이브러리를 구축하기가 어렵음), 플랫폼 버전 문제 (Java로 업그레이드 할 것입니다. 7 무언가를 깨뜨릴 수 있습니까?), 개발자 기술 ( "Joe"누가 JNI 통합을 남겼습니다. 누가 Java, C ++ 및 JNI를 아는가?). 이러한 문제의 합은 초기 개발을 수행하는 데 필요한 시간보다 (IMO)가 더 중요하다.

어렵다면 아마도 우리는 QT를 사용할 것입니다.

왜 그것에 집중하지 않습니까? 지금까지 Java가 선호 해야하는 이유는 언급되지 않았습니다.

가장 큰 부분이 뿌리 소스와 그것을 호출하는 코드는 아마도 C ++에서 모든 작업을 수행 할 것입니다.
QT와 함께 괜찮으므로 UI는 걱정할 필요가 없습니다.

편집하다:
나는 Java 접근 방식에 대한 장점을 실제로 볼 수 없습니다. 어쨌든 소스의 큰 부분을 다른 플랫폼으로 포트해야합니다. 래핑 레이어에 복잡성을 추가하고 더 많은 종속성이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top