2017-01-25 5 views
0

나는 컴파일 된 DLL (C/C++)을 가지고 있으며 Java에서 사용해야합니다. 그래서 SWIG를 사용하여 래퍼를 만들고 싶습니다. 사용 된 어떤 미리 컴파일 된 DLL 및/또는 Java 및/또는 Visual Studio (2015)SWIG 및 Visual Studio 2015와 함께 Java에서 컴파일 된 DLL 사용

그러나 모든 예제 : 내가 좋아하는 모든 튜토리얼을 따라 . 구현을 위해 자신의 cpp 파일을 사용할 때 (그리고 헤더를 구현하는 외부 DLL을 사용하지 마십시오) 모든 것이 잘 작동합니다 (단일 DLL로 컴파일하고 Java에서 호출).

원하는 것은 무엇입니까? 미리 컴파일 된 DLL (example.dll)과 헤더 (example.h) 및 SWIG 헤더 파일 (example.i)이 있습니다. 모든 것을 "래퍼 DLL"로 컴파일하고,이 파일을 Java에서로드하고 미리 컴파일 된 DLL (example.dll)에 액세스하십시오. 자세히

내 단계 :

  1. 새로운 VS 클래스 라이브러리 프로젝트
  2. 이 시간을 추가하고 난 (예에서 같은) 내가 파일에 대한 사용자 지정 빌드 단계를 추가
  3. 파일
  4. Java 파일 및 example_wrap.cxx 파일이 생성되었습니다.
  5. example_wrap.cxx를 추가하고 Java 포함을 추가하고 미리 컴파일 된 헤더를 사용하지 마십시오
  6. 컴파일 이제 전체 프로젝트를 생성
  7. 이 연결에 실패하지 않습니다 (자바 포함, 더 미리 컴파일 된 헤더, 아니 CLR 추가) (오른쪽인가요?) 튜토리얼처럼
  8. 설정 프로젝트 설정 example.lib하는 example_wrap.cxx example_wrap.obj에서 오류 LNK2019.

나를 도와 줄 사람이 있습니까?

내가 얻지 못하는 것 : 결과는 "example.dll"이됩니다. 이 DLL을 Java (System.load/loadLibrary)와 함께 사용해야합니다. 이 SWIG DLL은 어떻게 내부의 모든 로직을 가진 "원본"example.dll에 액세스 할 수 있습니까?

Java 대신 Python을 사용하면 동일한 오류가 발생합니다 (LNK2019 - 해결되지 않은 외부 기호).

답변

0

axalis의 답변은 전적으로 옳았습니다. 여기에 몇 가지 세부 사항이 있습니다 :

  1. 예제를 추가하십시오.CPP
  2. 을 LoadLibrary와
  3. 로드 미리 컴파일 된 DLL (example.dll) 방금 전화를 각 방법에 대한 "implemantation"를 쓰기 GetProcAddress를 함께 참조를 거기에서
  4. 로드의 방법을 저장하고 각 방법
  5. 에 대한 참조를 저장 메서드가로드되기 전에
  6. exampleWrap.dll에 모든 것을 컴파일하고 링크하여이 프로젝트를 Java 프로젝트에로드하십시오.
0

기본적으로 호출을 외부 라이브러리로 "전달"해야합니다. 나는. 거기에서 심볼을 래퍼 라이브러리로 가져오고 외부 DLL lib 파일과 링크합니다. 당신은 DLL에 대한 이러한 lib에 파일이없는 경우

, 당신은 (예를 들어, using some tool DLL에서 생성 LIB)를 만들거나 런타임 (LoadLibrary/GetProcAddress)에서 외부 라이브러리/수입 기호를로드하려면 다음 중 하나를해야합니다.