제 임무 중 하나입니다. 쉽게 설명된 사이트를 찾을 수 있어서 함께 나누고자 합니다.
우선은 기본적인 JNI 호출방법입니다. NDK 를 다운받으면 sample 폴더안에있는 코드들에서 사용되는 방법입니다.
http://jaehwa.egloos.com/1045412
딱 한페이지 짜리로 이해하는데 편하리라 생각됩니다.
다음은 JNI 네이티브 함수를 직접 등록 하는 방법입니다.
http://jaehwa.egloos.com/1045413
위의 방법보다는 좀 복잡합니다. 코드를 이해하는데 있어 바로 전에 올린
JNI 함수의 네이밍 규약 참고 사이트 게시물이 도움이 됩니다.
두방식간의 장단점은 아래에서 확인할 수 있습니다.
http://jaehwa.egloos.com/1029760
실제 성능상 차이가 있는지는 테스트 후에 다시 쓰겠습니다.
추가부분...
-> 제가 깨작깨작 가지고 놀던 앱에 적용해 보았습니다.
기본적인 JNI 호출방법일때 메소드 달랑 하나 였던 C 코드가 많이 길어지게 되네요.
복잡하지 않은 코드라 그런지 성능상에 큰 차이는 없었습니다.
복잡한 코드에서는 차이가 날것 같지만 제가 사용하는 코드 중에는 없어서 일단 나중으로 보류합니다.
성능이슈가 크지않다면 기본적인 방법이 심플한것같습니다.
성능의 차이 뿐만 아니라.. 사용방법에 차이가 많이 있습니다.
void JNI_OnUnload(JavaVM *vm, void *reserved);
를 하시면 인자값으로 들어오는것들 중 JavaVM *vm 가 있습니다.
요놈으로 특별한 일들을 할 수 있게 되는데
엄청난 성능차이가 발생되겠죠???
확실하지는 않으나 제 기역에는 ..
Thread 상황에서 jni 를 사용하면 충돌하게 되는데 이때
JavaVM *vm 을 통해서 현재 스레드를 체크하여 연동할 수 있습니다.
http://pllab.kw.ac.kr/j2seAPIs/guide/jni/spec/invocation.html#attach_current_thread
암튼 여러가지 이유에서 조사해봐야 할거 같네요..
JNI 보면 볼수록 어려워요 ㅋㅋ
JNI 는 양방향 입니다 Native -> Java , Java -> Native
물론 등록방법이 틀려집니다.
Class 의 Object 관리 하는게 문제가 되고 메모리 관리도 철저히 해줘야 합니니다.
기본적으로 Sun에서 Jni 에 대해서 연동규격 문서가 있는데 검색해보시면 나올겁니다.
http://www.androidpub.com/1930322#3
http://pllab.kw.ac.kr/j2seAPIs/guide/jni/spec/jniTOC.html