안드로이드에서 NDK를 이용하여 개발하기

안드로이드에서 C/C++ 코드로 된 모듈을 불러오기 위해서는 NDK (Native Development Kit) 를 이용해야만 합니다. 어떻게 설정해서 개발해야 하는지 간단히 알아봅니다.

먼저, 제 개발환경

  • OS: Windows 7
  • Eclipse: Eclipse IDE for Java Developer Indigo

1. Eclipse 에 C++ Development Tools 설치

Help > Install New Software > Choose “Indigo” as the update site > Select “Programming Language” Branch > Check “Eclipse C/C++ Development Tools

2. Cygwin 설치

http://www.cygwin.com 에 접속하여 setup.exe를 다운받음 > 인터넷으로 설치 선택 > 가까운 mirror 사이트 선택 > Devel 섹션에 있는 것은 Default 로 하지 말고 모두 설치 합니다.
* 주의 설치 경로에 빈칸이 있으면 안됩니다.

설치를 마치고 나서 Cygwin Terminal 을 띄우고, $make -v 를 입력시 아래처럼 나오면 성공입니다.


John@John-PC ~
 $ make -v
 GNU Make 3.82.90
 Built for i686-pc-cygwin
 Copyright (C) 2010 Free Software Foundation, Inc.
 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
 This is free software: you are free to change and redistribute it.
 There is NO WARRANTY, to the extent permitted by law.

3. 안드로이드 NDK 설치

안드로이드 NDK 공식 웹사이트에서 다운로드 후(압축파일임) 적당한 디렉토리에 압축을 풉니다. 제가 설치한 버전은 android-ndk-r7b 입니다.

4. 안드로이드 프로젝트 생성

이클립스 실행 > New Project > Android > Android Project 선택 > 프로젝트이름에 HelloNDK 라고 지어줌 > 빌드타겟 선택 > 패키지 이름은 sample.helloNDK라고 정해주면 자동으로 Activity 이름이 HelloNDKActivity 라고 셋팅됨 >

5. 코딩

Hello NDK 프로젝트 폴더 밑에 jni 라는 폴더 만들어줌 > jni 폴더 밑에 Android.mk 파일과 csource.c 파일 이렇게 두개 만들어 줍니다.
Android.mk 파일 내용

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Here we give our module name and source file(s)
LOCAL_MODULE := csource
LOCAL_SRC_FILES := csource.c

include $(BUILD_SHARED_LIBRARY)

csource.c 파일 내용

#include <string.h>
#include <jni.h>

jstring Java_sample_helloNDK_HelloNDKActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
 return (*env)->NewStringUTF(env, "Hello from C Code!");
}

HelloNDKActivity.java 파일 내용.

package sample.helloNDK;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;

public class HelloNDKActivity extends Activity {
 // load the library - name matches jni/Android.mk
 static {
   System.loadLibrary("csource");
 }

 // declare the native code function - must match ndkfoo.c
 private native String invokeNativeFunction();

 @Override
 public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   // this is where we call the native code
   String hello = invokeNativeFunction();
   new AlertDialog.Builder(this).setMessage(hello).show();
 }
}

6. csource.c 파일 빌드

먼저 참고로 제 HelloNDK 프로젝트 경로는 아래와 같고


$/cygdrive/c/Users/John/workspace/HelloNDK\


제 ndk-build 파일의 위치는 아래와 같습니다.

 $/cygdrive/d/Dev/Android/android-ndk-r7b/ndk-build


1) cygwin 에서 HelloNDK 프로젝트 파일 위치로 이동합니다.


John@John-PC
 $cd /cygdrive/c/Users/John/workspace/HelloNDK\


2) ndk-build 를 실행하여 라이브러리로 만듭니다.


John@John-PC ~/workspace/HelloNDK
 $ /cygdrive/d/Dev/Android/android-ndk-r7b/ndk-build
 Compile thumb : csource <= csource.c
 SharedLibrary : libcsource.so
 Install : libcsource.so => libs/armeabi/libcsource.so

 

3) Eclipse 의 HelloNDK 프로젝트 밑에 libs 라는 폴더가 생성되고 그 아래 libcsource.so 라는 파일이 아래그림처럼 나와야 합니다.


7. 프로젝트 실행

아래 그림처럼 나오면 성공입니다.

참고 URL : http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/

Advertisements

About sydlife

Lazy programmer, Dad and Husband.

14 comments

  1. 민총

    make-v 입력했을때 command not found 라고 나오면 .. 시그윈 처음부터 다시깔아야하나요?ㅠㅠ

    • 이 명령은 make 의 버전을 확인하는 커맨드인데, 혹시나 해서 여쭤보는건데, make 랑 -v 사이에 한칸 띄우셨나요? ^^ make -v입니다. make-v 아니구요 ^^

      • 민총

        make -v 쳤을때 제대로나왔어요^^ 그때 띄고 했었구요. 문제는 ndk-build 를 입력하면 안된다는게 문제인데 그것보다

        설명 중에
        1) cygwin 에서 HelloNDK 프로젝트 파일 위치로 이동합니다.
        John@John-PC
        $cd /cygdrive/c/Users/John/workspace/HelloNDK

        이부분있죠 ~
        제 프로젝트파일경로 그대로 쳤는데 No such file or directory 라고 뜨네요.
        그대로 입력했고 글자 하나도 안틀렸는데.. 파일도 그 경로안에 있구요.

        환경변수 문제인가요?;
        우선 make -v 가 되었으니 확실히 잘 설치된건 맞겠죠?

      • 정말 희한하네요. 프로젝트 디렉토리, 파일 다 있는데, 그쪽으로 이동이 안된다니… 허걱.
        뭐가 문제인지 저도 잘 모르겠네요. – -;;
        암튼 make 가 먹는걸 보면 설치랑 환경셋팅은 제대로 된 거 같은데요?

      • 아마 John을 지금 개발하시는 분 컴퓨터에 맞게 고쳐야 할 듯 합니다.

  2. 이종원

    #include
    #include

    jstring invokeNativeFunction(JNIEnv *env, jobject javaThis)
    {
    return (*env)->NewStringUTF(env, “Hello from C Code!”);
    }

    이 부분에서
    #include
    #include
    이 앞에 모두 물음표가 뜨면서
    Unresolved inclusion
    Unresolved inclusion
    이라고 떠있는데..헤더파일을 찾지 못해서인듯 한데..
    해결 방법은 어떻게 되는지 아시나요?

  3. Pingback: json socket facebook android unity3d | proprieties

  4. aaa

    핡…저는안돼요…
    so 파일도 만들어지고 에러도 그냥은 안뜨는데
    실행해보면 그냥 종료되네요…ㅜ.ㅜString hello = invokeNativeFunction(); 이부분때문에 안되는것같은데 ㅠ

  5. aaa

    jstring Java_sample_helloNDK2_HelloNDKActivity_invokeNativeFunction
    저는 이렇게 썼는데 Java_sample_helloNDK2_HelloNDKActivity_이부분이 의미가 있는건가요?,

Comments are closed.

%d bloggers like this: