상세 컨텐츠

본문 제목

[안드로이드] NDK 기본 예제

Programming/안드로이드

by 영상털이범 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 하기



관련글 더보기

댓글 영역

  • 프로필 사진
    2014.09.27 11:39
    비밀댓글입니다
    • 프로필 사진
      2014.10.01 15:46 신고
      setContentView(R.layout.main)은 main이라는 이름의 레이아웃을 사용하겠다는 뜻이고
      main.xml안에
      id가 tv_result인 TextView를 직접 만들어주셔야 합니다.
      아주 기본적인 내용이기에 어떻게 설명해야되는지 모르겠는데..
      일단 안드로이드 책을 보시면서 처음부터 공부하시고 NDK는 나중에 접근하시는것을 추천합니다.

      또한 참고로 말씀드리자면 R.java파일은 절대로 건드리시면 안됩니다.
  • 프로필 사진
    2014.10.09 00:36
    비밀댓글입니다
  • 프로필 사진
    2014.11.14 10:46
    설치부터 알려주신대로 소스 전부 입력했는데요
    MainActivity class에서 stringFromJNI()부분에서 에러가 납니다.
    해당 메소드가 없다는 뜻인거 같은데
    jni에 파일을 만들어 줫음에도 빨간줄이 뜨는 이유와 빌드를 했을때 so파일을 나타났는데
    이대로 실행이 가능한지 여부를 알고 싶습니다.