꿈 많은 개발자가 되자! Tae-hwan

Android ndk를 이용한 계산기 프로그램 본문

Android Dev/NDK

Android ndk를 이용한 계산기 프로그램

taehwan 2012.04.13 03:03
크리에이티브 커먼즈 라이선스

Creative Commons License 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
본문

 Android NDK를 이용해서 간단하게 계산기를 제작해봤습니다. if문을 이용하여 명령에 따라 제작할려고 했지만 인식하는데 문제가 있는지 잘 안되더군요. 결국 각각 명령마다 함수로 분리하여 제작하였습니다. 좀 바보 같은 짓이죠. ㅜㅜ 


Android NDK 설치법 (현재는 r7c 버전으로 업데이트 되었습니다.) 아래 방법은 r7b 버전이지만 모두 동일합니다.

  http://thdev.net/117


아래 방법을 사용하기전에

  제가 사용한 개발 OS는 Ubuntu이며, eclipse, Android-NDK-r7c를 사용하였습니다.

  Ubuntu 에서 $PATH를 미리 등록해두었습니다. ndk-build 명령을 쉽게 사용하기 위해서입니다.

  제가 사용한 $PATH 등록 방법은

home dir에서  vi .bashrc / gedit .bashrc
를 열고, 아래 명령을 추가해주었습니다.
#android-ndk-r7b PATH
export PATH=$PATH:/home/tae/android-ndk-r7c
PATH 의 경로는 /home/tae/android-ndk-r7c 이기에 위와 같이 등록했습니다.

위와 같은 간단한 사전 준비를 하고 시작하겠습니다.


프로젝트 생성

 Android Project 를 생성합니다. 저는 Project Name은 calculator 로 정했습니다.


Android Version은 2.3.3 을 선택했습니다.


 Application Info 부분에 package Name 을 정해줘야 합니다. 주의 하실 점은 . 으로 구분하여야 하며 고유한 이름이어야 합니다. 대부분 자신의 도메인을 활용합니다. 저는 제 도메인을 활용하여 net.thdev.calculator 을 사용하고 프로젝트를 생성했습니다.


이제 터미널 또는 탐색기에서 생성한 프로젝트 아래로 이동합니다. (저는 터미널을 사용하여 설명하겠습니다.)

윈도우의 경우 생성한 프로젝트는 c:\User(사용자)\사용자명\workspace\에 생성됩니다.

리눅스에서는 /home/사용자명/workspace/ 에 기본 생성됩니다.

아래와 같이 제가 만든 프로젝트로 접근하여 새로운 폴더를 하나 만들었습니다. 폴더이름은 jni 로 만들었습니다.
 리눅스 명령어
   

mkdir jni


 이제 아래와 같이 총 4개의 파일을 생성하겠습니다. 제가 짠 소스코드는 2개의 파일만으로도 가능합니다. .mk와 calcJni.c 만 있어도 충분하지만 아래와 같이 만들게 되었습니다.


 Android.mk

Android.mk 파일은 ndk-build 를 위한 파일입니다. 

 calc.h 

calc.c 파일의 head 파일입니다. 

calc.c  

계산을 위한 소스코드 파일입니다. 

 calcJni.c  

c코드를 호출 하기 위한 jni 코드가 포함되어 있는 파일입니다. 



Android.mk 파일 소스코드

# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# the purpose of this sample is to demonstrate how one can
# generate two distinct shared libraries and have them both
# uploaded in
#

LOCAL_PATH:= $(call my-dir)

# first lib, which will be built statically
#
include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-calc //계산 모듈의 이름
LOCAL_SRC_FILES := calc.c //계산 모듈의 파일명

include $(BUILD_STATIC_LIBRARY)

# second lib, which will depend on and include the first one
#
include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-calcjni //Jni 파일의 모듈명
LOCAL_SRC_FILES := calcJni.c //Jni 파일명

LOCAL_STATIC_LIBRARIES := libtwolib-calc //최종적으로 만들어지는 이름 build 후 .so 로 제작 됨

include $(BUILD_SHARED_LIBRARY)

include $(BUILD_STATIC_LIBRARY) 는 Shared LIBRARY를 생성할 경우 사용할 수 있는 스태틱 라이브러리를 생성하라는 의미이고,

include $(BUILD_SHARED_LIBRARY)는 shared Library를 생성하겠다는 말로 최종 결과물은 .so 파일을 빌드하겠다는 의미입니다.


calcJni.c 파일

 Jni 빌드를 위한 파일은 지난번 리뷰에서도 작성했지만 지켜줘야 할 게 있습니다. 지켜주지 않으시면 Android 빌드시 찾을 수 없다는 오류 메시지가 표시될 것입니다. 그렇다면 꼭! Jni 연결 부 코드를 꼭 확인 하셔야 합니다. #include <jni.h> 부분도 잊으시면 안됩니다.

jint Java_net_thdev_calculator_CalculatorActivity_calSum 부분을 잘 확인하셔야 합니다.

jint - return Type

Java - Java 에서 사용 될 코드라는걸 알려줘야 합니다.

net_thdev_calculator - android package 명입니다. android에서 package 명은 . 이지만 여기서 _ 부분으로 작성하시면 됩니다.

CalculatorActivity - ndk를 사용할 class 파일 명입니다. 다른 class에서 사용하게 된다면 꼭 변경하셔야 합니다.

calSum - Android 에서 불러올 때 사용할 함수명 입니다.

#include "calc.h"
#include <jni.h>

//+ 연산
jint Java_net_thdev_calculator_CalculatorActivity_calSum(JNIEnv* env,
				       jobject this,
				       jint x,
				       jint y)
{
	return sum(x, y);
}
//- 연산
jint Java_net_thdev_calculator_CalculatorActivity_calSub(JNIEnv* env,
				       jobject this,
				       jint x,
				       jint y)
{
	return sub(x, y);
}
//* 연산
jint Java_net_thdev_calculator_CalculatorActivity_calMult(JNIEnv* env,
				       jobject this,
				       jint x,
				       jint y)
{
	return mult(x, y);
}
//나누기(/) 연산
jint Java_net_thdev_calculator_CalculatorActivity_calDivision(JNIEnv* env,
				       jobject this,
				       jint x,
				       jint y)
{
	return division(x, y);
}


calc.h 파일

#ifndef CALC_H
#define CALC_H

extern int sum(int x, int y);
extern int sub(int x, int y);
extern int mult(int x, int y);
extern int division(int x, int y);

#endif 

calc.c 파일

#include "calc.h"

int sum(int x, int y) {
	return x + y;
}

int sub(int x, int y) {
	return x - y;
}

int mult(int x, int y) {
	return x * y;
}

int division(int x, int y) {
	if(x>0)
		return x / y;
	else
		return 0;
}

Build

 위와 같은 코드가 완성되었습니다. 이제 build 해주면 됩니다.  Build 명령은 위에서 말 했듯이 ndk-build 만 사용합니다. 만약 $PATH 등록을 하지 않으셨다면 /home/사용자명/android-ndk-r7c/ndk-build 를 사용하셔야 합니다.(윈도우는 MinGW를 사용하게 됩니다)


.SO 파일이 정상적으로 만들어졌는지 확인해야 합니다. Android.mk 에서 작성했던 libtwolib-calcjni.so 파일이 아래와 같이 armeabi 폴더에 생성되었습니다. 정상적으로 생성되지 않으셨다면 빌드 과정에서 에러가 나셨을 겁니다. 소스코드 수정을 해주셔야 합니다.


Eclipse에서 코딩하기

 Eclipse에서 코딩을 해야 합니다. 그 전에 프로젝트 위에서 F5번 키 또는 오른쪽 마우스 클릭 후 새로고침을 해주셔야 합니다.

 새로고침을 하게 되면 jni 폴더와 armeabi 폴더가 추가된걸 확인 하실 수 있으실 겁니다.


소스코드는 아래에 추가로 올려두겠습니다. 그래서 주요코드만 간단히 작성하겠습니다.

별다른 주요코드는 없습니다. 사용해야 할 class 저는 CalculatorActivity.java 입니다. 이 class 안에 아래 코드를 추가해주어야 합니다.

public native int calSum(int x, int y);
    public native int calSub(int x, int y);
    public native int calMult(int x, int y);
    public native int calDivision(int x, int y);
    
    static {
    	System.loadLibrary("twolib-calcjni");
    }

 위 코드와 약간 많은 xml과 java코드를 작성을 통해 완성한 화면입니다. 엉성하지만 동작하는데 문제가 없습니다.

NDK로 계산기 만들기에는.. 사실상 무리가 있어보입니다. 간단한걸 NDK까지 활용해야 한다니 ㅜㅜ 힘들었습니다. switch, if 문 모두 안먹어서요. 결국 위 코드로 되었지만.. 문제 해결 못하고 올리게 되었네요 ㅜ



프로젝트 다운로드 링크 (아래 압축 파일로 다운이 안되시면 아래 링크를 이용해주세요. 둘 다 동일합니다.)

  http://db.tt/gfw6sBxJ


calculatorzip.zip



개인 광고 영역
16 Comments
댓글쓰기 폼