infatuation

Android NDK 설치 & Hello JNI 예제 본문

Study/Android

Android NDK 설치 & Hello JNI 예제

화령 2011. 4. 10. 02:45

- NAtive code를 안드로이드 애플리케이션에 적용할 수 있게 함
- NDK는 다음을 제공

C와 C++로 라이브러리 작성하는 툴
라이브러리를 Android에 적재할 수 있는 .apsk로 변환하는 방법 제공
Native System headers & libraries
Documentation, samples & tutorials

- NDK 활용의 예 : 신호처리, 물리 시뮬레이션, 커스텀 바이트코드/ 명령어 인터프리터 등과 같이
 메모리를 너무 많이 할당하지 않으면서도 CPU를 많이 사용하는 작업에 적함

- 장점 : 빠른실행
- 단점 : 이식성 없음, JNI 오버헤드 수반, 시스템 라이브러리에 접근불가, 디버깅 어려움
- 한계

    1) C에서 실행되는 메소드를 단순히 재코딩 하는것 으로는 성능향상에 큰 도움이 되지 않는다.
    2) NDK가 native-only 어플리케이션 개발은 힘들다.
    (Please note that the NDK does not enable you to develop native-only application)
  3)안드로이드의 첫 번째 런타임은 Dalvik 가상머신에 있다.

- 포함 되어 있는 C 헤더
 
libc ( C 라이브러리 ) 헤더 /   libm ( math 라이브러리 ) 헤더 /   Jni Inter face 헤더

 - 호환성을 보장하는 방법( application using a native library produced with the NDK)
 
해당 매니페스트 파일에 android:minSdkVersion="3" 속성과 함께 <users-library> 엘리먼트를 반드시 선언한다. 


* NDK Download 받기

URL : http://developer.android.com/sdk/ndk/index.html
 
Android developers 사이트에 가면 SDK 페이지 좌측에 메뉴에 Native Development Tools 메뉴에서 NDK 선택
Download the Android NDK 에서 자신의 개발환경에 맞는 OS 선택 - 난 Windows 


* NDK 설치하기

 다운받은 android-ndk-r4.zip 파일을 Cygwin이 설치된 폴더 안의 Home에 복사
 copy path  - C:/cgywin/home/계정명/  밑에 복사해줌 


  * NDK 빌드

Cygwin Bash Shell 을 실행해서 android-ndk-r4 폴더로 이동
 
- 빌드할 프로젝트 폴더인 samples로 이동 >>  android-ndk-r4/samples/hello-jni
 
- ndk-build 를 실행하여 빌드 시작 >> /home/Ryoung/android-nkd-r4/ndk-build -B  


 
 .so 파일 생성
 
/android_ndk/samples/hello-jni/libs/armeabi 경로에 가면 libhello-jni.so 파일 생성된 것 확인할 수 있다.


*Eclipse에서 Android 에뮬레이터에 Hello Jni 실행하기
 
예제 파일이였던 Hello Jni가 들어있는 Sample 파일 가져와서 프로젝트 생성
 
- 경로 : android-ndk/samples/hello-jni 

 
 ndk 빌드해서 생성한 .so 파일 확인  

Android 에뮬레이터 부팅이 ㅣ끝나면 HelloJni 구동화면 볼 수 있음



*HelloJni.java
package com.example.hellojni;
import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
public class HelloJni extends Activity {
           /**Called when the activity is first created.*/
           @Override
           public void onCreate(Bundle savedInstanceState) {
                      super.onCreate(savedInstanceState);
                      

                      TextView    tv= new  TextView(this);
                      tv.setText( stringFromJNI() ); // A native 함수호춗
                      setContentView(tv);
           }
           

           // A nativefunction
           public  native  String   stringFromJNI();


           // 정의하지 않은 함수 호춗시 java.lang.UnsatisfiedLink  Errorexception 발생!
           public  native  String   unimplementedStringFromJNI();
           //     /com.example.HelloJni/lib/libhello-jni.so
           static{
                      System.loadLibrary("hello-jni");
           }
}
*Hello-Jni.c
#include <string.h>
#include <jni.h>
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
           return  (*env) -> NewStringUTF(env, "Hello From JNI !");
}
*MakeFile
APP_PROJECT_PATH :=$(call my-dir)/project
APP_MODULES          := hello-jni
*strings.xml
<!--?xml version="1.0" encoding ="utf-8"?-->
<resources>
            <string name="app_name"> HelloJni </string>
</resources>

'Study > Android' 카테고리의 다른 글

안드로이드 SD카드  (0) 2011.05.08
Cygwin을 설치해 봅시다~  (0) 2011.04.10
안드로이드 애플리케이션 빌드 에러  (0) 2011.03.29
안드로이드 서비스  (0) 2011.03.02