2014 학년도 3-1 정보컴퓨터공학부 컴퓨터 소프트웨어 설계 및 실험
JNI 환경 구축 JNI 의 개념 JNI 사용
Cygwin 이란 ? Windows 에 Linux 와 유사한 환경을 제공. 두 개의 파트로 구성. 1. 실제 Linux API 기능 제공, Linux API emulation layer 로서의 역할을 하는 DLL(cygwin1.dll) 2.Linux Look & Feel 을 제공하는 툴. Cygwin 이 필요한 이유 안드로이드는 Linux 2.6 커널 기반. 공유 라이브러리 파일로.so 파일을 사용함 ( 윈도우는.dll)
강의자료 페이지에서 cygwin_setup-x86.exe 를 실행 에서 setup.exe 를 실행.
실행 후 아래 화면이 뜨면 [ 다음 (N)] 버튼을 누름. Install from Internet 버튼을 선택하시고 다음 버튼을 누름.
Root Directory 는 D:\Cygwin 으로 지정. Local Package Directory 는 D:\cygwin_package 로 지정.
Devel : 옆에 Default 를 눌러 Install 로 바꿈 Shell 항목의 mintty 줄 의 skip 을 클릭.(skip 대 신 숫자가 뜬다 )
아래 화면에서 다음 버튼을 누름. 설치 시작하고 오류 메시지 같은 게 뜨면 그냥 OK 클릭하면 됨
인스톨 완료 후 체크박스 선택 후 마침. 시작 -> 프로그램 ->cygwin->Cygwin Terminal 이 있는 걸 확인할 수 있음
JNI 를 사용하기 위해서는 NDK 를 설치. Android NDK 의 이용. 안드로이드에서 C/C++ 로 된 Native 코드를 컴파일해서 수행할 때 JNI 를 이용하여 Java class 에서 사용하고자 할 때
에서 자신의 컴퓨 터의 window bit 에 맞는 파일을 다운로드
다운로드 한 압축파일을 D:\cygwin\home\ 사용자이름 \ 안에 압축 해제.
바탕화면 내 컴퓨터 시스템 속성 고급 환경 변수 선택 사용자 변수에 ‘Path’ 가 있다면 Path 변수 선택 후 편집 (E) 버튼 클릭 없다면 새로 만들기 (N) 클릭
편집 시 변수 값의 끝에 ; 가 없다면 ; 을 입력하고 ndk 경로를 입력 후 확인. 새로 등록 시 변수 이름에 Path 를 입력하고 변수 값에 ndk 경로 입력 후 확인.
android-ndk-r9d\samples\hello-jni\jni 이동
cmd 창에 ndk-build 명령어 입력.
Hello-jni 폴더에 libs 와 obj 폴더 생성 확인.
자바가상 머신 (Java Virtual Machine) 자바 바이트코드를 실행할 수 있음. 일반적으로 인터프리터 방식으로 실행. 자바가상 머신의 특징 스택 기반. C 와 같이 주소 값을 임의로 조작하는 포인터 연산 불가능.
Java Native Interface 자바 이외의 언어 ( 네이티브 언어 ) 로 만들어진 모듈이나 애플리케이션과 자바 클래스가 서로 상호작용 할 수 있게 정의한 인터페이스. 자바가상 머신 (JVM) 이 원시 메소드를 적재하고 수행할 수 있도록 함. JNI 가 자바가상머신내에 포함. 자바가상 머신이 호스트 운영체제상의 입출력, 그래픽스, 네트워킹, 스 레드 같은 기능들을 작동하기 위한 로컬 시스템 호출을 수행할 수 있도록 함.
안드로이드 프레임워크는 C/C++ 기반 모듈이 계층별로 구성. C/C++ Layer 와 JAVA Layer 가 서 로 상호작용하면서 동작. C/C++ 과 자바 레이어가 유기적으 로 동작하기 위해 상위 계층과 하위 계층을 연결해주는 매개체가 필요. 그 매개체가 JNI !!!!
자바 클래스에서 C 언어로 작성 된 라이브러리에 포함된 특정 함수 를 사용하고 싶은 경우. C 프로그램에서 자바 클래스 라이브러리를 사용하고 싶은 경우. C 측자바 측 JNI Functions Libraries Classes VM Exception
빠른 처리 속도를 요구하는 루틴 작성 보통 자바가 Native Code 에 비해서 느림. 따라서 빠른 처리 속도를 필요로 하는 부분 은 C/C++ 로 작성하고 이를 JNI 를 통해 자바에서 호출하는 방식으로 속도 향상을 시킬 수 있음. 하드웨어 제어 하드웨어 제어 코드를 C 로 작성한 다음 JNI 를 통해 자바 레이어와 연결. 기존 C/C++ 프로그램의 재사용 기존의 C/C++ 코드를 작성했다면 굳이 자바로 동일한 코드를 작성 할 필요 없이 JNI 를 통해 기존 코드를 활용할 수 있음.
1. C 파일과 mk 파일 생성 2. C 코드 작성 3. Mk 코드 작성 4. 자바 코드 작성 5. so 파일 생성 6. 프로그램 실행
JavaJNI(C) JNI(C, 배열 ) booleanjbooleanjbooleanArray bytejbytejbyteArray charjcharjcharArray shortjshortjshortArray intjintjintArray longjlongjlongArray floatjfloatjfloatArray doublejdoublejdoubleArray objectjobjectjObjectArray
Hello-jni.c 1.jstring 은 return 타입이고 2. 그 다음은 Java_ 패키지명 1_ 패키지명 2_ 패키지명 3_class 명 _ 메 소드명 () 3.class 명에 '_' 기호가 들어갈 경우 에러가 난다
Android.mk 1.LOCAL_MODULE : 생성 할 library 이름 2.LOCAL_SRC_FILES : 자신이 만든 c 파일 이름
MainActivity.java 1.System.loadLibrary 에 이전에 만들었던 MODULE 명 hello-jni 를 넣어준다. 2.public native String stringFromJNI() 라는 메소드가 jni 와 연결된다. 3.hello-jni 로부터 String 을 return 받아 tv 라는 TextView 로 값이 전 달된다.
cmd 창을 실행하여 현재 작성한 프로젝트 파일의 경로로 이동한다 ndk-build 라는 명령어를 입력하면 현재 프로젝트의 libs->armeabi 라는 폴더가 생 기며 폴더 안에 파일이 생성되어 있을 것이다.