티스토리 뷰
Android NDK를 이용해서 간단하게 계산기를 제작해봤습니다. if문을 이용하여 명령에 따라 제작할려고 했지만 인식하는데 문제가 있는지 잘 안되더군요. 결국 각각 명령마다 함수로 분리하여 제작하였습니다. 좀 바보 같은 짓이죠. ㅜㅜ
Android NDK 설치법 (현재는 r7c 버전으로 업데이트 되었습니다.) 아래 방법은 r7b 버전이지만 모두 동일합니다.
아래 방법을 사용하기전에
제가 사용한 개발 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 문 모두 안먹어서요. 결국 위 코드로 되었지만.. 문제 해결 못하고 올리게 되었네요 ㅜ
프로젝트 다운로드 링크 (아래 압축 파일로 다운이 안되시면 아래 링크를 이용해주세요. 둘 다 동일합니다.)
'Android Develop' 카테고리의 다른 글
Android 촬영 후 사진과 포토앨범에서 사진 가져오기 코드 (25) | 2012.06.09 |
---|---|
Android SDK GPU emulation 사용하기 (0) | 2012.04.13 |
Android apk 추출 방법 (0) | 2012.04.02 |
카카오톡 3.0 테마 만들기 (2/2) - 제작과 실행하기 (54) | 2012.03.30 |
Ubuntu에서 Android NDK r7 설치 및 예제코드 사용 (0) | 2012.03.29 |
댓글