ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [안드로이드] NDK 기본 예제
    Programming/안드로이드 2014. 1. 27. 04:02
    반응형

    NDK를 이용한 기본 예제이다. 간단한 프로그래밍은 기본예제의 변형으로 가능할 것이다. 더 깊은 내용은 나중에 포스팅 하도록 하겠다.


    NDK 설치 완료후 제대로 설치가 되었는지 이 예제를 통해서 확인해보길 바란다. 먼저 프로젝트를 하나 생성한다. 프로젝트명은 HelloJNI로 하였다.


    프로젝트 생성후 jni라는 이름의 폴더를 하나 생성한다. 이 폴더안에 2개의 파일을 생성할 예정이다.

    2개의 파일 이름은 Android.mkhello-jni.c 이다.


    jni폴더 생성후 [마우스 오른쪽 클릭] -> [New] -> [File] 을 눌러 파일을 생성한다.




    위의 그림의 방식처럼 hello-jni.c 와 Android.mk 파일을 만들었다면 두 파일에 내용을 넣는다. 먼저 hello-jni.c 파일부터 내용을 넣겟다.


    hello-jni.c

    #include <string.h>
    #include <jni.h>
    
    jstring Java_tjssm_hellojni_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz )
    {
    
        return (*env)->NewStringUTF(env, "Hello from JNI !");
    }
    

    NDK 설치를 확인하기 위한 간단한 예제이기 때문에 자세한 설명은 생략하도록 하겠다. 

    여기서 주의할 점은 jstring Java_tjssm_hellojni_MainActivity_stringFromJNI()이다.

    jstring은 return 타입이고 그다음은 Java_패키지명1_패키지명2_class명_class에서만든메소드명() 이다.


    ex) return타입이 jstring 이고 패키지명이 tjssm.hellojni이고 class명이 MainActivity이고, class에 만들어 놓은 메소드명이 stringFromJNI 이기때문에jstring Java_tjssm_hellojni_MainActivity_stringFromJNI() 이라고 쓴다.


    여기서 주의할 점은 패키지명이나 class명에 '_'기호가 들어갈 경우 에러가 난다는 것이다. ndk를 이용한 프로그래밍에서는 '_'기호를 넣지 않도록 한다.


    다음은 Android.mk 파일에 내용을 넣겠다.


    Android.mk

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := hello-jni
    LOCAL_SRC_FILES := hello-jni.c
    
    include $(BUILD_SHARED_LIBRARY)
    

    LOCAL_MODULE 은 c파일의 이름

    LOCAL_SRC_FILES 에는 c파일의 이름에 .c를 붙여주면 된다.


    다음은 JAVA소스이다. jni를 호출하는 MainActivity의 소스이다.


    MainActivity.java

    public class MainActivity extends Activity {
    	
    	private TextView tv;
    	
    	static {
    		System.loadLibrary("hello-jni");
    	}
    	
    	public native String stringFromJNI();
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		
    		tv = (TextView) findViewById(R.id.tv_result);
    		tv.setText(stringFromJNI());
    	}
    }
    

    System.loadLibrary에 이전에 만들었던 c파일의 이름인 hello-jni를 넣어준다. 

    public native String stringFromJNI() 라는 메소드가 jni와 연결된다.

    return 타입이 String 이므로 이전에 작성했던 hello-jni로부터 String을 return 받아 tv라는 TextView로 값이 전달된다.


    위와 같이 소스를 작성하였다면 ndk-build를 실행한다. cygwin 폴더안의 android-ndk폴더를 환경변수로 등록을 하였다면 cmd 창을 실행하여 현재 작성한 프로젝트 파일의 경로로 이동한다. 그후에 ndk-build라는 명령어를 입력하면 현재 프로젝트의 libs->armeabi 라는 폴더가 생기며 폴더안에 파일이 생성되어 있을것이다.


    이제 이 프로젝트를 실행시키면 다음과 같은 결과를 얻을 수 있다.



    매번 cmd창을 이용하여 ndk build를 할 수는 없으니 다음에는 이클립스에서 ndk build하는 방법을 알아보도록 하겠다.



    2014/01/27 - [Programming/안드로이드] - [안드로이드] Eclipse에서 NDK-build 하기



    반응형
Designed by Tistory.