구글애드센스


SWIG 포인터 사용 법에 대해서... (Java) STUDY



swig 인터페이스 파일을 작성할때 포인터를 어떻게 해야하는지 조금 애매한 구석이 없잖았다.
typemaps.i 가 어쩌고 various.i 가 어쩌고.. 그러다가 조금 진득하게 문서를 읽어보니 대충 감이 와서 몇 자 끄적거려본다.

일단 다들 알겠지만 c/c++의 포인터는 포팅하려는 타깃 언어에는 없을 확률이 높다.
그러다보니 포인터를 사용한 c/c++ 소스에서 타깃 언어로 변경시 뭔가 작업을 해줘야 하는게 당연한 것이다.

보통 포인터를 사용하게 되는 가장 큰 이유는 한가지다.
"메모리에 직접 액세스 하기 위해서."
그런데 read 와 write가 끝인 컴퓨터에게 있어서 메모리에 직접 액세스 한다는 의미는 "읽기 위해서", "쓰기 위해서" 로 바꿀수 있겠다.

여기서 잘 생각해보자. c/c++의 함수를 타깃 언어에서 사용하는데 "읽기 위해서" 일 때와 "쓰기 위해서" 일 때가 조금 다를거라는 감이 오지 않는가? 예를 들면 다음과 같은 경우가 있을 것이다.

c/c++ 함수에 첫번째 파라미터 char* sz어쩌구 가 있다고 치자.
이 sz어쩌구는 데이터가 담겨있다. 즉, NULL 일리가 없는 문자열 데이터라는 뜻이다. 이 sz어쩌구를 전달받은 함수는 이 값을 그냥 쓰게 된다. 즉, 읽기 위한 목적 이라는 말이다.(INPUT)

또다른 c/c++ 함수에 파라미터 char* sz랄랄라 가 있다고 치자.
이 sz랄랄라는 그저 메모리 공간이고 c/c++ 함수는 어떤 데이터를 여기다가 적어서 올려주고 싶다. 즉, 쓱 위한 목적 이라는 말이다. (OUTPUT)

이렇게 목적이 확연히 나뉘는 포인터를 swig 이 랩퍼를 만들 때 반드시 필요할 것이므로 input 인지 output 인지를 표시해줘야 한다. 그래서 이 때 사용하는것이 typemap 이라는 것인 것 같다. 일종의 변환식에 대한 정책(?)을 정하는 것인데 JNI 랩퍼와 어떤식으로 데이터를 넘기고 받을 것인지를 설명하는 것 이랄까. swig 문서를 찾다보면 데이터타입에 대한 jni 데이터 타입 설명이 나와 있는 것이 이것과 관련이 있다.

물론 이런 작업들은 꽤나 번거롭기 때문에 이미 누군가가 input, output 에 따라 구현을 해 놓은것이 있고, 그것들이 typemaps.i 니 various.i 니 하는 파일들이다. (어디에 붙어있는지는 잘 모르겠는데 하여간.) 나 같은 쪼렙 개발자는 이런 것들을 가져다가 쓰면 되겠다.

뭔가 예제를 덧붙이고 싶지만 회사라서 이만 여기까지.




덧글

댓글 입력 영역