[C/C++ 타 언어간 인터페이스] SWIG 요약 정리

 

SWIG 요약 정리

 

SWIG

SWIG란?

C++, C 와 같은 Native 바이너리를 JAVA, C#과 같은 Managed 환경과 Python 같은 다른 언어에서 사용하도록 해주는 개발 툴

지원 언어

 C#, JAVA, JAVASCRIPT, Lua, Ruby, PHP, Python, 등 왠만한 언어들은 지원이 되고 있다. 이밖에도 D, Go 등 유명하지 않은 언어들도 지원하고 있음.

어떤 특징이 있나? 

자바만 기준으로 가장 큰 특징은, "충분히 검증된 방식의 기존 기술(JNI)을 재사용하면서, 적용이 자연스럽고(에러가적고), 그위에 추가 기능을 쌓아올렸다는 점(클래스 바인딩)". 

허나 이러다보니 JNI보다 퍼포먼스가 떨어진다는 것은 어쩔 수 없다.

내 C++ 코드를 적용 하는 방법

JAVA만 해봤으므로, JAVA만 설명한다.

1. 먼저, 해당 C++ 프로젝트를 빌드하여, 바이너리(Window라면 dll)를 생성한다.

2. SWIG Interface 파일을 작성한다. (*.i 파일)

3. Swig.exe에 작성한 Interface 파일을 이용하여 타겟언어의 Wrapping 클래스들을 생성한다. (*.java 들이 생성됨)

swig -기반언어 -타겟언어 -package 패키지명 <인터페이스 파일>

예) swig -c++ -java -package net.kniz.MyFrameworks MyFrameworks.i

 

4. 해당 java 파일과 C++ dll 파일을 Java 프로젝트에 포함시킨다.

이때 eclipse 기준으로, 프로젝트 루트에 dll을 넣는다. (bin, src 폴더를 하위폴더로 가지고 있는 곳!)

5. Wrapping 클래스들을 자바클래스 처럼 사용하면 된다.

 

물론, 이상적인 방법이 이렇다는 거지, 해보면 이런저런 시행착오나 오작동을 경험하게 된다. (이 바닥이 다 그렇져 머)

에러 : Unsatisfied Link 

근본적인 원인은 한가지, 그 이유는 크게 2가지로 나눠 볼 수 있다.

가장 큰 원인은 "DLL과 자바 헤더가 다름" 인데, 그 이유는 다음과 같다.

 

1. DLL과 JVM이 서로 다른 32bit, 64bit 환경이다 : 둘을 일치시켜줘야 한다. 이 경우, 대게 로그 파일로 가면 %1 is not valid Win32 와 비슷한 로그가 뜨게 된다. 이 경우 JVM이 64비트, DLL이 32비트인 경우다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

2. 두번째는 DLL과 생성한 자바 래핑 클래스들이 일치하지 않는 경우다. 잘못된 이름으로 JNI를 사용하려다보니 에러가 생성된다.

알아둘 이슈1

C++ 단에서 호출되는 콜백을 자바단에서 받을 수 없다. 따라서 UI 프레임웍처럼 인스턴스를 시스템이 관리하면서 적절한 시기에 이벤트를 trigger 하는 C++ 프레임웍의 경우 JAVA 단에서 클래스를 상속하여 오버라이딩해도 C++ 단까지만 동작되어버린다. 이는, SWIG의 동작원리와도 관계가 있다.

 

이에 대한 해결책이 참 마땅찮아서(어쩌면 SWIG를 찾아보면 해결책이 있는지도 모른다. 2-3일정도만 훑어본지라 다는 모르겠다) 나는 인스턴스 관리를 JAVA단에서 처리하는 방법으로 해결했다.

 알아둘 이슈2

최대한 Primitive 이외의 헤더는 숨기자. 

int, short, float, char 등은 알아서 SWIG에서 변환되지만, 그 외에 사용자 정의 타입들(대표적으로 class)은 앞서 말한 것처럼 interface 파일에 추가를 시켜줘야 한다.

게다가 directX나 stl 같은 라이브러리 라면, 대략 난감해질 수 있기에, 귀찮다 싶으면 이를 최대한 DLL 내부링크로 숨겨버리자.

 

참고로, 나 같은 경우는 DIRECTX 헤더를 포함시키는 게 싫어서 최대한 안에다 숨기고, 밖에 노출될 필요성이 있는 것들은 void*로 내보냈다.

알아둘 이슈3 

자바는 unicode이니까 wchar_t 를 사용해야 할 것 같지만, SWIG는 char를 써야 한다.

 평가

비슷한 툴인 BridJ 도 써봤지만, 아직 사용에는 무리가 따른다. 포인터 래핑이 불편하고, 다양한 케이스가 적용되지 않으며 무엇보다 1년째 개발이 진행되지 않음.

반면에 SWIG는 사용도 편리(작성 및 래핑된 클래스 사용)하며, 단체가 큰 만큼 쉽게 개발자들이 도망가지는 않을 것 같다.

추천!

 

 

출처: https://kniz.tistory.com/entry/SWIG-요약-정리 [FairyTales.:티스토리]

 

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수

등록된 글이 없습니다.

대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED