JNI 는 Java Native Interface의 약자로 Java 에서 다른 언어의 코드의 수행을 돕는 interface 이다.
이를 통해 안드로이드에서 c 나 c++ 코드를 실행시킬 수 있다.
[수행 목표]
Android 에서 JNI 수행 (C와 연동)
(-안드로이드 앱에서 특정 버튼을 누르면 JNI 를 통해 string을 반환하여 보이는 것이 구현 목표)
[수행 환경]
window 7 64 bit (intel i3 )
android-studio-bundle-141.2135290-windows (Android studio 1.3 버전)
android-ndk-r10e-windows-x86_64 (ndk : Native Development Kit)
jdk 1.8.0.51 설치
Gradle version 2.4
compile 'com.android.support:appcompat-v7:22.2.1'
compileSdkVersion 22 ㄴbuildToolsVersion "22.0.1"
SDK Platforms
-Android 5.1 (Lollipop) API 22
SDK Tools
- Android SDK Build Tools
- Android SDK Tools 24.3.3
- Android SDK Platform-Tools 22
- Android Support Repository, rev 16
- Android Support Library, rev 22.2.1 (얘는 중요-> support:appcompat,이놈과javah 와 관련 (*2))
[일지]
2015-08-17-10:~12:00 : javah 동작 성공
2015-08-17-16:00 : .mk build.gradle 수정 시도 후 Sync 에러
2015-08-17-18:00 : APP_BUILD_SCRIPT 의 path 에러 잡음
2015-08-17-18:30 : env * struct 잡고 성공
[요약]
이건 빠르게 할 수 없음.ㅠㅠ
환경변수 설정 -> .java ->.class -> jni 폴더 + .h 생성 -> .c -> .mk -> gradle
1단계 : 안드로이드 External Tools 설정 및각종 환경 변수 확인. (jdk 관련된거 제외하고 기본 값으로 돌릴 것을 강력 추천)
ndk-build 와 javah 의 설정은 (index *) 를 참고
그리고 각자 수행 과정 중 환경 변수와 관련된거 같은 각종 에러들이 뜰 것이다.
(실제로 그런 에러가 있을 수도 있는데....)
대부분은 상관없다.
내 환경변수에는
path : C:\Users\(이름)\AppData\Local\Android\sdk;
JAVA_HOME : C:\Program Files\Java\jdk1.8.0_51
시스템 변수 path : C:\Program Files\Java\jdk1.8.0_51\bin 이정도만 있음.
2단계 : .java 파일 작성
(여기서 native method 선언)
#MainActivity.java 파일 일부
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("HelloNative"); }
public native static Stringhello1(); public native static String hello2(); @Override protected void onCreate(Bundle savedInstanceState) { 이는 안드로이드스튜디오 파일을 그대로 복사한 화면이다.
여기서 hello1() 과 hello2() 는 아래의 전체 과정을 모두 수행해도 error 표시가 뜬다. 그러니 신경 쓰지 말것
(cannot resolve corresponding JNI function .....)
참고로 저의 구현 목표는 화면에 있는 특정 버튼을 누르면 JNI 에서 string을 반환하여 textView를 바꾸는 것
3단계 : .class 파일 생성
(Make Project 또는 Clean Project 이후 Rebuild Project 를 수행하면 .class 파일이 생성된다.!)
(index *)External Tools 설정 : http://kanais2.tistory.com/m/post/171
(*3) .mk 작성 참고 : https://www.davidlab.net/ko/tech/using-the-android-ndk-with-android-studio-part1/
(*4) C 함수 struct 이슈 : http://www.phonesdevelopers.com/1772873/
NDK_PROJECT_PATH 이슈 : 임의로 NDK_PRJECT_PATH 를 환경 변수에 넣어 놓고 바꾸지 않은 상태에서 마지막 build 할때 일이었다. 이때 APP_BUILD_SCRIPT points to an unknown file 이런 에러 였고 해당 환경 변수 값을 지워도 계속 떴다.
지우고 리붓하니 해결됨.
(... 그리고 안드로이드 스튜디오 이용할 때 jni.h jni_md.h 이슈가 안난게 신기함)