안드로이드 NDK를 이용하면 JNI가 가능하긴 하지만, 불편한 것이 한두가지가 아니다. 특히, JNI를 위한 껍데기 코드를 짜는 것에 굉장히 많은 시간이 낭비된다. 그래서, SWIG(Simplified Wrapper and Interface Generator) 같은 대안이 있긴 하지만, SWIG의 C++ to Java, Java to C++ 생성기는 enum을 사용하는데, 안드로이드 개발 가이드라인에서는, 성능 문제로 enum을 사용하지 말라고 권고한다. (실제로 좀 느리기도 하다.)

여러가지 이유로, 혼자 만들어서 안드로이드 NDK가 필요한 프로젝트들에서 사용하던 라이브러리가 있는데, 공개해야지 공개해야지 하다가, 이제서야 좀 가다듬고, NDK r4 가 나온 기념으로, NDK r4 형식으로 말아서 올린다.

http://github.com/jong10/rosetta 에서 최신버전을 다운받을 수 있으며1, Python이 필요하다. 윈도우에서 개발하는 경우는, python이 cygwin 안에 설치되어 있어야 한다. 이 프로젝트를 받으면, 안드로이드 프로젝트 형식인데, 프로젝트 위치에서 ./build_all.sh 을 실행하면, 로제타로 C++과 Java를 위한 껍데기 코드가 자동 생성되고, 그 후에 C++이 NDK를 통해 빌드가 된다. 그 후에 이클립스 등에서 Java를 빌드하고 안드로이드 에뮬레이터나 기기에서 실행하면 된다. JNI 부분이 바뀌지 않고, 로직만 바뀌는 경우는, 기존처럼 ndk-build 를 이용하면 된다. 단지, 자동 생성되는 스텁 코드를 업데이트해야 할 경우만, ./build_all.sh 를 사용한다.

사용할 함수는 rosetta/settings.py 에서 등록해서 쓰면 되며, Java에서 C++ 함수를 호출하거나, C++에서 Java 함수를 호출할 때 필요한 stub code를 자동 생성해준다. 제약사항으로는, 호출 당하는 코드는 Singleton이어야 한다. (좀 큰 제약사항이지만, 이것을 극복하려면, 로제타 자체가 10배는 더 커진다. 인스턴스 관리를 동기화 해야 하므로.). 제약사항이 좀 맘에 안 들지만, 적당히 쓸만한 것 같고, 실제로 약 8개월 이상 진행된 모 통신사의 안드로이드 프로젝트에서, 로제타가 사용되었다.

아, 좀 더 치명적인 단점이 하나 더 있는데, 아직은 배열을 지원하지 않는다. 내가 좀 한가해지면, 지원하게 될 지도 모르지만. -_-;; 마지막으로, 치명적인 버그가 있다면 메일을 보내주시면 감사하고, 버그 패치도 같이 보내주시면 더욱 감사. :-)

– 이상한 나라의 종텐.

p.s. 조만간, 시간을 내서, 좀 자세한 사용법을 써야겠다.. ㅠㅠ

  1. 원래 bitbucket.org 에 올렸었는데, 나중에 github.com 으로 옮겼다.