AndroidStudio 환경에서 JNI 개발하기

|

안드로이드에서 JNI를 자주 쓰는게 아니다보니 할때마다 헷깔리고...

툴이 ADT에서 AndroidStudio로 바뀌면서 IDE 의존적인 부분이 변경되서

이참에 아예 정리차 포스팅...


예전엔 cygwin에 뭐에 상당히 복잡했던걸로 기억하는데 그래도 많이 간단(?) 해진듯....





1. NDK는 SDK와는 별도. NDK 홈페이지에 가서 개발환경에 맞는 NDK를 받아 적당한곳에 압축을 풀어둔다.









2. JNI에서 사용할 java쪽 native method를 생성한다.

사용하는 클래스에 넣어도 상관없고, 아예 JNI전용 클래스를 만들어도 상관없는데, 중요한건 메소드에 달린 native 키워드.









3. Ctrl+F9나 메뉴의 Build-Make Project를 눌러 빌드를 한번 진행해둔다.

빌드를 한번 하는 이유는, 자바 클래스 파일에서 C 헤더를 뽑아주는 javah가 .java 소스파일이 아닌 .class 바이트코드 파일을 참조하기 때문.




4. 안드로이드스튜디오 기본 설정으론 프로젝트 뷰가 Android 로 되어 있는데, 이 모드에서는 빌드시 생성되는 파일들이 안보인다.

편의를 위해 Project 뷰로 변경.







그러면 모듈디렉토리/build/intermediates/classes/debug에 생성된 class 파일들을 확인할 수 있다.






5. 소스쪽 디렉토리에 jni 디렉토리를 생성하고,







생성된 jni 디렉토리에 javah와 class파일을 이용해서 JNI .h 헤더파일을 생성한다.




javah 명령은,

javah -classpath 클래스패스 클래스명

구조이다.







생성된 .h 파일을 확인할 수 있다.










6. 이 상태에서 빌드를 하면 ndk를 찾을 수 없다고 오류가 발생한다.




프로젝트의 local.properties를 열어 ndk.dir 경로를 설정해야 한다.










7. JNI의 구현부와 사용하는 부분을 코딩한다.




System.loadLibrary에서 사용되는 이름은 기본적으로 모듈 이름이다. 변경법은 아래에.








Gradle Build 과정에 compileDebugNdk 부분을 확인할 수 있다.








각 아키텍쳐별로 생성된 .so 파일도 확인할 수 있다.










실행도 잘 된다.













Note #1. 라이브러리 명 (.so파일명)을 변경하고 싶다면,

모듈의 build.gradle 파일을 열어 moduleName을 정의해준다.





moduleName을 변경하면 .so파일명도 변경되고, System.loadLibrary()에 사용되는 이름도 변경해주어야 한다.












Note #2. android_log_print() 사용시 컴파일 오류





C에서 __android_log_print()를 사용했는데 빌드 중 오류가 발생한다면,

android log library를 빌드에 추가해주어야 한다.



모듈별 build.gradle에 ldLibs "log" 를 추가해 준다.






정상적으로 로그가 출력되는것을 확인할 수 있다.











Note #3. ndk 구버전 버그인지는 모르겠는데,

.h 파일 하나와 .c 파일 하나만 있는 경우, 빌드시 No rule 어쩌고.. 하는 오류가 발생한다고 한다.

암튼 이건 버그가 맞고, 해결하려면 그냥 빈 .c 파일을 하나 추가해주면 된다고 한다.




And