본문 바로가기

JNI

JNI Spec #2 이 chapter는 JNI 설계의 주요 이슈에 대해서 다룬다. 가장 큰 설계 이슈는 native methods와의 관계이다. API 호출에 관한 설계는 Chapter 5에서 설명한다. JNI Interface Functions and Pointers Native code는 Java VM에 JNI function을 호출함으로서 접근한다. JNI function은 interface pointer를 통하여 사용된다. 이 pointer는 사전에 정의된 pointer array를 가르킨다. Interface pointer는 pointer의 pointer이며, 이 pointer는 배열로 이루어져 있다. 모든 Interface function은 사전에 정의된 offset에 때라 배열에 위치한다. 그림 생략 --> 중.. 더보기
JNI reference Global Reference - 개발자가 해제하기 전까지 유효함, GC되지 않음 weak Reference - 개발자가 해제하기 전까지 유효함, GC됨 local Reference - mthoad 안에서 자동적으로 해제됨 더보기
JNI Spec #1 Chapter 1 JNI는 VM과 device간의 상호 운용을 통하여 VM하단을 구현할 수 없던 제약을 해결해준다. 하나의 native application/library 버젼으로 모든 java VM에서 구동한다. Java Native Interface Overview java 뿐만 아니라 다른 언어로도 구현할 수 있다는 내용 - platform dependent feature - 다른 언어로 쓰여진 library를 이미 가지고 있을 때 사용하면 유용 - 작은 부분의 time-criticla coe를 작성할 수 있다. (assembly 같은) 갖가지 장점들을 나열 하고 있지만... 단점도 많다. 내 생각에는 하드웨어 dependency가 아니라면 궂이 안 쓰는게 좋을 것 같다. Historical Bac.. 더보기
Android dynamic link 현재 안드로이드에서 제공되는 JNI를 이용할 경우 생성된 .so 파일이 다른 so를 참조하고 있으면 문제가 된다. 간단하게 말하면 못 찾는다. 별의 별 test를 다 해 본 결과... 안된다는게 결론... data/data//lib 에 들어있는 .so는 system/lib에 있는 .so를 1개만 로딩 할 수 있다. Why ? 이유는 linker 문제인 것으로 판단된다. 어떤 똑똑한 사람이 이걸 정리해 놨길래 나도 해봤다. 하지만 실패하였다. 내 PC 의 사용자 이름이 한글로 되어있어서... google에서 배포한 sdk에 셋팅된 emulator는 ....................... 문제 없는데 내가 ubuntu에서 직접 생성한 img는 문제가 되는 구나 어쨌거나.. 영문으로 사용자 등록된 pc를 .. 더보기
shared object 사용하기 linux shared object 생성하기 arm-none-linux-gnueabi-gcc -l/usr/lib/jvm/java-6-sun/include -l/usr/lib/jvm/java-6-sun/include/linux -fpic -c test_nativeTest.c arm-none-linux-gnueabi-ld -T armelf_linux_eabi.xsc -shared -o test_nativeTest.so test_nativeTest.o java code에서 so를 호출한다. class a{ static{ system.load(/data/com_test_nativeTest.so); } } 생성한 so 를 adb push test_nativeTest /data/ 명령을 이용하여 emulator에 .. 더보기
javah javac로 만들어 놓은 class 중 jni 를 사용하기 위한 header를 추출하기 위한 방법이다. 일반적으로 package가 설정되지 않은 파일의 경우는 다음과 같이 실행된다. test.java javac test javah test 하지만 package가 있는 파일의 경우는 package 명을 붙여줘야 에러가 나지 않는다. src 의 package 구조가 다음과 같다면 src /a/testpkg/test.java javac /src/a/testpkg/*.java -d bin bin 폴더에 다음과 같은 구조로 파일이 생성된다. bin/aa/testpkg/test.class javah 를 실행하기 위해서는 bin 폴더로 이동한다. 다음과 같이 명령어를 내리면 test.h 파일이 생성된다. javah .. 더보기