티스토리 뷰

크리에이티브 커먼즈 라이선스
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



개인 광고 영역


댓글
  • 프로필사진 개발자 저기요 질문있는데요
    c++작성된 이미지파일(영상처리 파일)을 이클립스의
    안드로이드 에뮬레이터에 구동시키려고 하는데(포팅)
    jni함수 쓰는 것이 맞는지요??

    그리고 이게 구현 가능한 시나리오 인가요??
    2012.04.14 19:29 신고
  • 프로필사진 BlogIcon taehwan JNI 함수를 사용하면 안드로이드 에뮬레이터로 사용가능합니다. c++에서 작성한 코드도 역시 중간에 JNI 부분으로 만들고 개발하시면 됩니다. 어떤 부분을 개발할 것인진 모르지만.. 아래 내용 한번 참고해부세요.

    NDK-Build 에 참고하시면 media, audio 부분이 있기는 한데 아마 사용하실려고하는 것과는 많이 다를 겁니다. 한번 참고하셔서 사용해보시면 좋을 듯 합니다.
    2012.04.14 22:28 신고
  • 프로필사진 비밀댓글입니다 2012.04.14 22:54
  • 프로필사진 BlogIcon taehwan 제가 도움을 드릴 수 있을지 모르겠네요. 봐드릴 수야 있지만 제가 잘하는게 아니라 저도 학생이기도 하구요. .. 봐드리길 원하신다면 @@ 으로 메일 주시면 봐드리겠습니다. 원하는 답을 얻으실 수 있을지 모르겠네요. 2012.04.15 00:25 신고
  • 프로필사진 개발자 메일 보내드렸습니다.

    확인 부탁드립니다..^^
    2012.04.15 00:10 신고
  • 프로필사진 BlogIcon taehwan 메일 확인 중입니다! 메일로 답변 드리겠습니다. 2012.04.15 00:25 신고
  • 프로필사진 비밀댓글입니다 2012.05.05 12:02
  • 프로필사진 BlogIcon taehwan 감사합니다^^ 2012.05.06 11:49 신고
  • 프로필사진 BlogIcon 견가가 mk 파일 관련하여 궁금한 점이 있는데요,
    BUILD_STATIC_LIBRARY와 BUILD_SHARED_LIBRARY 두개가 각각 어떤 역할을 하는건지요 'ㅁ'?
    2012.09.17 14:06 신고
  • 프로필사진 BlogIcon taehwan BUILD_SHARED_LIBRARY 는 말그대로 Shared 라이브러리를 생성하겠다는 말로 여기서는 .so 파일을 빌드하겠다는 뜻입니다.
    BUILD_STATIC_LIBRARY 는 Shared 라이브러를 생성 시에 사용을 할 수 있게 돕는 라이브러리입니다. 결과물로 스태틱 라이브러리가 생긴다고 하네요.
    2012.09.17 14:39 신고
  • 프로필사진 DDD android-ndk-r4
    사용하는데 방법 똑같을까요?
    ndk-build에서 자꾸 경로를 못찾는것(?) 같아서여 ㅠ
    2012.11.22 22:22 신고
  • 프로필사진 BlogIcon taehwan 일단 ndk-build는 패스에 등록해주셔야 합니다. 등록해주지 않으면 당연히 경로를 찾지 못하게 됩니다.

    사용하시는 OS에 따라서 다르니 아래를 참고하세요. 그리고 윈도우는 설명하지 않았습니다.
    home dir에서 vi .bashrc / gedit .bashrc
    를 열고, 아래 명령을 추가해주었습니다.
    #android-ndk-r7b PATH
    export PATH=$PATH:/home/tae/android-ndk-r7c
    PATH 의 경로는 /home/tae/android-ndk-r7c 이기에 위와 같이 등록했습니다.
    2012.11.23 00:05 신고
  • 프로필사진 sss 님꺼를 제 디바이스에서 돌렸는데 왜 안되죠 ??????

    프로젝트 그대로 삣겨서 썻는데;;;
    2013.07.07 01:01 신고
  • 프로필사진 BlogIcon taehwan NDK 빌드해보셨는지요..? 2013.07.07 09:36 신고
  • 프로필사진 종이눈 프로젝트 하나로 잔뜩 배우고 가네요.

    감사합니다 ㅎㅎ
    2013.12.31 01:22 신고
  • 프로필사진 BlogIcon taehwan 감사합니다.!^^; 2013.12.31 09:30 신고
댓글쓰기 폼
Total
5,054,189
Today
322
Yesterday
1,420
«   2018/05   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
글 보관함