Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]David Lee저희 팀에서 Docker Swarm을 처음 도입한 계기는 사실 배포 자동화 프로세스 구축하고 싶었기 때문이었습니다.
처음엔 서버가 하나 뿐이여서 컨테이너 오케스트레이션의 묘미를 느끼지 못했는데 관리자, 푸시, 이벤트, 테스트 등등 여러 서버가 붙으면서 여러개의 서버를 관리해야 했는데
미리 구축해놓은 Docker Swarm이 많은 편의 기능을 제공하고 있어서 여러개의 서버를 관리하는 것도 개발자가 부담없이 할 수 있게 되었습니다.
이 슬라이드는 제가 서버를 구축하는 과정에서 겪었던 어려움들을 여러분은 겪지 않길 바라며 제작하게 되었습니다.
만약 이 슬라이드를 보시는 분이 Docker및 Docker Swarm을 처음 접해보시는 거라면 이 자료가 좋은 가이드가 될 수 있을 것 같습니다.
감사합니다.
이도현 드림
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 DockerXpressEngine요즘 규모에 상관 없이 서버를 운영하는 웹서비스 업체에서는 도커라는 주제가 화두입니다. 오히려 발빠른 개발자나 운영자들은 이미 도커를 이용하여 서비스를 운영하고 있지요. 본 세션은 도커의 기술적인 내용 보다는 사용자 입장에서 알아야 할 내용을 중심으로 구성됩니다.
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담Sumin Byeon이 발표는 넥슨의 신규 개발 게임인 듀랑고의 생태계에 대한 간략한 소개와 OpenCL 을 이용한 병렬 처리에 관한 전반적인 기술적 내용을 다룹니다. 게임 속의 세계에서 지형과 기후, 지질 조건에 맞게 여러 종류의 식물과 광물들을 알맞은 곳에 배치시키는 것이 생태계 시뮬레이터의 역할인데, 이 시뮬레이터는 방대한 양의 계산을 수행합니다. 초기에 만들어진 프로토타입은 이러한 계산을 수행하는데 30분이 넘게 걸렸지만, 병렬처리, 알고리즘 시간복잡도 개선 등의 여러가지 방법들을 통해 그 시간을 11초까지 단축시켰습니다. 구체적으로 어떤 방법들을 시도했었고, 어떤 방법들이 효과가 있었는지 여러분과 그 경험담을 공유하고자 합니다.
Docker 로 Linux 없이 Linux 환경에서 개발하기iFunFactory Inc.2016 아이펀팩토리 Dev Day 발표 자료
강연 제목 : Docker 로 Linux 없이 Linux 환경에서 개발하기
발표자 : 김진욱 CTO
<2016>
- 일시 : 2016년 9월 28 수요일 12:00~14:20
- 장소 : 넥슨 판교 사옥 지하 1층 교육실
도커없이컨테이너 만들기 8편 - pid namespaceSam Kim전체목차: https://netpple.github.io/docs/make-container-without-docker/
pid namespace는 컨테이너 안에서 독자적인 "process tree" / "process id 체계"를 제공합니다. 어떻게 가능한 것일까요? 이를 이해하기 위하여 proc filesystem과 pid 쳬계에 대해서 얘기합니다. 그리고 프로세스 트리의 최상위인 특별한 프로세스 pid1 에 대하여도 다룹니다
Hyperledger Fabric practice (v2.0) wonyong hwangHyperledger Fabric practice material for Korea Polytechnics students
- Build Your First Network
- Chaincode Development
- Chaincode Devolopment via IBM Blockchain Platform
- Balance Transfer
- Vote system example using 'Balance Transfer' tutorial
spring.io를 통해 배우는 spring 개발사례Daehwan Leespring.io 레퍼런스(sagan project)를 통해서 배우는 spring 개발사례에 대해서 발표하고 정리한 프레젠테이션입니다. 작년에 SpringOne에서 발표된 inside spring.io 내용과 저의 개인적인 분석을 통해서 내용을 정리했습니다.
'입문자' 분들을 대상으로 정리했기 때문에 가능한한 간결하고 직관적으로 내용들을 표현했으며 깊게 들어가는 내용들은 거의 생략을 하였습니다.
자세한 내용들을 원하시면 프레젠테이션 중간중간에 관련 link를 첨부하였으니 같이 보시면은 도움이 되실것 같습니다.
Titanium 소개 - 당신이 알고 있는 타이타늄 rev.201310JongEun Lee크로스 모발일 개발 플랫폼인 타이타늄(Titanium) 소개 자료입니다.
이 자료는 다음과 같은 모임에서 발표자료로 사용되었습니다.
* 타이타늄 개발자 커뮤니티인 TiDev.kr의 2013년 8월 정기모임
* JsLounge 2013년 9월 모임
* DevOn 2013 10월 26일
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]David Lee저희 팀에서 Docker Swarm을 처음 도입한 계기는 사실 배포 자동화 프로세스 구축하고 싶었기 때문이었습니다.
처음엔 서버가 하나 뿐이여서 컨테이너 오케스트레이션의 묘미를 느끼지 못했는데 관리자, 푸시, 이벤트, 테스트 등등 여러 서버가 붙으면서 여러개의 서버를 관리해야 했는데
미리 구축해놓은 Docker Swarm이 많은 편의 기능을 제공하고 있어서 여러개의 서버를 관리하는 것도 개발자가 부담없이 할 수 있게 되었습니다.
이 슬라이드는 제가 서버를 구축하는 과정에서 겪었던 어려움들을 여러분은 겪지 않길 바라며 제작하게 되었습니다.
만약 이 슬라이드를 보시는 분이 Docker및 Docker Swarm을 처음 접해보시는 거라면 이 자료가 좋은 가이드가 될 수 있을 것 같습니다.
감사합니다.
이도현 드림
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 DockerXpressEngine요즘 규모에 상관 없이 서버를 운영하는 웹서비스 업체에서는 도커라는 주제가 화두입니다. 오히려 발빠른 개발자나 운영자들은 이미 도커를 이용하여 서비스를 운영하고 있지요. 본 세션은 도커의 기술적인 내용 보다는 사용자 입장에서 알아야 할 내용을 중심으로 구성됩니다.
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담Sumin Byeon이 발표는 넥슨의 신규 개발 게임인 듀랑고의 생태계에 대한 간략한 소개와 OpenCL 을 이용한 병렬 처리에 관한 전반적인 기술적 내용을 다룹니다. 게임 속의 세계에서 지형과 기후, 지질 조건에 맞게 여러 종류의 식물과 광물들을 알맞은 곳에 배치시키는 것이 생태계 시뮬레이터의 역할인데, 이 시뮬레이터는 방대한 양의 계산을 수행합니다. 초기에 만들어진 프로토타입은 이러한 계산을 수행하는데 30분이 넘게 걸렸지만, 병렬처리, 알고리즘 시간복잡도 개선 등의 여러가지 방법들을 통해 그 시간을 11초까지 단축시켰습니다. 구체적으로 어떤 방법들을 시도했었고, 어떤 방법들이 효과가 있었는지 여러분과 그 경험담을 공유하고자 합니다.
Docker 로 Linux 없이 Linux 환경에서 개발하기iFunFactory Inc.2016 아이펀팩토리 Dev Day 발표 자료
강연 제목 : Docker 로 Linux 없이 Linux 환경에서 개발하기
발표자 : 김진욱 CTO
<2016>
- 일시 : 2016년 9월 28 수요일 12:00~14:20
- 장소 : 넥슨 판교 사옥 지하 1층 교육실
도커없이컨테이너 만들기 8편 - pid namespaceSam Kim전체목차: https://netpple.github.io/docs/make-container-without-docker/
pid namespace는 컨테이너 안에서 독자적인 "process tree" / "process id 체계"를 제공합니다. 어떻게 가능한 것일까요? 이를 이해하기 위하여 proc filesystem과 pid 쳬계에 대해서 얘기합니다. 그리고 프로세스 트리의 최상위인 특별한 프로세스 pid1 에 대하여도 다룹니다
Hyperledger Fabric practice (v2.0) wonyong hwangHyperledger Fabric practice material for Korea Polytechnics students
- Build Your First Network
- Chaincode Development
- Chaincode Devolopment via IBM Blockchain Platform
- Balance Transfer
- Vote system example using 'Balance Transfer' tutorial
spring.io를 통해 배우는 spring 개발사례Daehwan Leespring.io 레퍼런스(sagan project)를 통해서 배우는 spring 개발사례에 대해서 발표하고 정리한 프레젠테이션입니다. 작년에 SpringOne에서 발표된 inside spring.io 내용과 저의 개인적인 분석을 통해서 내용을 정리했습니다.
'입문자' 분들을 대상으로 정리했기 때문에 가능한한 간결하고 직관적으로 내용들을 표현했으며 깊게 들어가는 내용들은 거의 생략을 하였습니다.
자세한 내용들을 원하시면 프레젠테이션 중간중간에 관련 link를 첨부하였으니 같이 보시면은 도움이 되실것 같습니다.
Titanium 소개 - 당신이 알고 있는 타이타늄 rev.201310JongEun Lee크로스 모발일 개발 플랫폼인 타이타늄(Titanium) 소개 자료입니다.
이 자료는 다음과 같은 모임에서 발표자료로 사용되었습니다.
* 타이타늄 개발자 커뮤니티인 TiDev.kr의 2013년 8월 정기모임
* JsLounge 2013년 9월 모임
* DevOn 2013 10월 26일
FreeRTOSAnkita TiwariThe document discusses real-time operating systems (RTOS) and FreeRTOS. It defines an RTOS as an OS intended for real-time applications that processes data without buffering delays. Popular RTOS include VxWorks, QNX Neutrino, FreeRTOS, and others. FreeRTOS is an open source RTOS kernel for embedded devices that provides task management, communication and synchronization primitives. It supports various architectures and is designed to be small, simple and provide low overhead.
Native vs. Web vs. Hybrid: Mobile Development ChoicesJason GrigsbyThe document discusses the choices and tradeoffs between developing native mobile apps, mobile web apps, and hybrid apps. It notes that while native apps have advantages like performance and access to device features, the mobile web is more open and has lower costs. Hybrid apps attempt to combine the best of both by using web technologies like HTML and JavaScript with APIs that allow accessing device capabilities. The performance of mobile web technologies is improving but some applications still require native development.
HTML5를 활용한 하이브리드 앱개발하기정현 황This document discusses various options for developing mobile applications including native apps, web apps, and hybrid apps. It focuses on hybrid frameworks like PhoneGap, Titanium, and Appspresso which allow developing apps using web technologies that are then wrapped into native containers. These hybrid frameworks provide access to device features while developing using HTML, CSS, and JavaScript instead of native languages. Demo code examples are provided for building hybrid mobile apps with jQuery Mobile and Sencha Touch using the Appspresso framework.
RAD Studio XE8을 소개합니다.Devgear커넥티드 앱을 개발하는 가장 완벽한 플랫폼 RAD Studio XE8의 새로운 기능들을 정리한 발표자료입니다.
iOS 유니버셜 앱, 비콘, Box2D 등 소프트웨어 개발자라면 요즘 가장 많은 관심을 가지고 있을 IT기술들이 RAD Studio에 어떻게 적용되었는지 확인해보세요.
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 APINAVER EngineeringObfuscation 101
: 난독화, 프로가드, R8, 트랜스포머 API
김용욱
카카오뱅크
영화와 커피를 좋아하는 은행원. 반지 원정대는 극장에서만 15번을 보았다. 데이터베이스를 전공했지만 급변하는 모바일 환경에 반해 안드로이드에 승선했고 Realm을 통해 모바일과 데이터베이스를 융합했다. 그후 새로운 가능성을 찾아 금융으로 왔다.
(추천자마린교육)Xamarin.android에서 안드로이드 자바 라이브러리 바인딩 하는 방법_EmbeddedJar, 자바 JAR 파일을 자...탑크리에듀(구로디지털단지역3번출구 2분거리)안드로이드 앱에서 사용할 수있는 많은 자바 라이브러리가 있다. 바인딩 라이브러리를 만들어 Java 라이브러리를 Xamarin.Android 응용 프로그램에 통합하는 방법에 대해 알아보자
Android용 라이브러리는 방대하기 때문에 새로운 Android 라이브러리를 만드는 것보다 기존 Android 라이브러리를 사용하는 것이 좋다. Xamarin.Android는 이러한 라이브러리를 사용하는 두 가지 방법을 제공한다.
C#에서 Java 코드를 호출 할 수 있도록 C# 래퍼로 라이브러리를 자동으로 래핑하는 바인딩 라이브러리를 만드는 방법과 Java Native Interface (JNI)를 사용하여 Java 라이브러리 코드에서 직접 호출을 호출하는 방법이 있다. JNI는 Java 코드가 네이티브 응용 프로그램 또는 라이브러리에 의해 호출 될 수있게 해주는 프레임 워크이다.
아래는 첫 번째 방법인 하나 이상의 기존 Java 라이브러리를 응용 프로그램에 연결할 수있는 어셈블리로 래핑하는 Bindings 라이브러리를 만드는 방법에 대한 설명이다.
Xamarin.Android는 Managed Callable Wrappers (MCW)를 사용하여 바인딩을 구현하는데 MCW는 Java 코드를 호출해야 할 때 사용되는 JNI 브리지로 호출 가능 래퍼는 Java 유형의 서브 클래스 작성 및 Java 유형의 가상 메소드 대체를 지원한다.
마찬가지로 Android 런타임 (ART) 코드가 관리 코드(C#)를 호출하기를 원한다면 Android Callable Wrappers (ACW)라고하는 다른 JNI 브리지를 통해 코드를 호출한다.
Facebook apiSangon LeeThe document provides steps to integrate Facebook login and authorization into a mobile app using the Facebook SDK for iOS. It includes instructions on installing the SDK, creating a Facebook app, adding code to handle login and authentication, and displaying login and authenticated views. Key steps are:
1. Install Facebook SDK and add necessary files to Xcode project
2. Create a Facebook app and get app ID and secret
3. Add code to AppDelegate to handle session state changes and open/close sessions
4. Add LoginViewController to display login screen modally and call authentication methods
5. Add code to view controllers to show login screen if unauthenticated and main app screen if authenticated
2. 안드로이드 NDK
- 안드로이드 SDK와 함께 이용되는 개발키트
=> 안드로이드 NDK를 사용하면 애플리케이션의 일부 또는 전부를
c/c++로 만들수 있다.
=> NDK로 만들어진 실행파일은 바이너리코드이다.(기계어)
- NDK 포함된 것들
=> 컴파일러, 링커,ToolChain,헤더파일,라이브러리,문서, 예제소스
- SDK가 기본으로 사용되며, NDK는 보조적인 역할을 하기 위해 사용
- NDK에서 할수 있는 것들
=> OpenGL/ES , OpenSL/ES(사운드), 센서입력,터치패널
=> NativeActivity , 리눅스시스템콜
=> Assets폴더로부터 데이터입력(파일을 추가할때마다 빌드필요없다)
3. 안드로이드 내부구조(계층)
- 리눅스 커널 => 하드웨어 추상계층(HAL) => 라이브러리,안드로이드런타임
=> 애플리케이션 프레임워크 => 애플리케이션
- 안드로이드 런타임 : (달빅VM)
- 애플리케이션 프레임워크 : 버튼,텍스트박스 같은 애플리케이션을
동작시키는데 필요한 라이브러리가 포함
- 애플리케이션 실행환경
=> 자바소스 => VM바이트코드 =>VM =>라이브러리 => 커널
- NDK 실행환경
=> 네이티브코드 => 라이브러리 => 커널
자바로 만들어지 부분중 NDK코드는 달빅VM을 거치지 않고 바로
라이브러리를 호출한다.
4. 안드로이드 내부구조(계층)
- SDK,NDK같이 개발한 소스는 VM바이트코드+네이티브코드 포함한
하나의 실행파일에 공존하게 된다.
- NDK경우 c/c++로 만든코드는 컴파일러와 링커를 거쳐 .so 파일로 생성
=> 공유라이브러이 이므로 단독으로 동작할수 없다.
- 자바코드 (.dex파일)로 부터 호출하여 .so 모듈을 이용
- 자바코드을 빌드할때 모듈(.so)을 이용하여 실행파일(.apk)생성
- NDK단점
1. 디버깅이 어렵다
2. 디바이스마다 실행파일 만들어야한다.(하드웨어 의존성)
- NDK장점
1. 빠른속도의 데이터 처리(이미지처리, 게임등)
2. c/c++ 라이브러리 사용
5. 안드로이드 NDK 설치 for OS X
- NDK 설치는 압축파일 형태로 배포되어 압축을 풀기만 하면 완료.
- 맥OS X 기준으로 설명
1. http://developer.android.com/sdk/ndk/index.html (NDK다운)
2. 임시폴터에 압축풀기
$ tar xvf android-ndk-r5c-darwin-x86.tar.bz2
$ sudo mv android-ndk-r5c /Developer/SDKs/
3. android-ndk-r5폴더에 포함된 명령어 실행하도록 패스 추가
export $PATH=/Developer/SDKs/android-ndk-r5c:$PATH
6. 안드로이드 NDK 설치 for Window
- Window 기준으로 설명
1. www.cygwin.com에서 시그윈설치(GNU make필요하기 때문)
=> 리눅스에서 자주 사용되는 명령어를 윈도우에서 가능하게
=> Cygwin 설치 시에 Select Packages 단계에서 'make'를 체크 후 설치
2. 큰 카테고리에 +를 눌러서 활성화 시키면 아래 항목들 활성화
Devel : gcc-core, gcc-g++, make, swing
Editor : vim
* Devel통째로 받아서 설치 추천~!!
3.Windows 환경변수에서 PATH설정
C:cygwinbin;C:cygwinusrinclude 추가
7. 안드로이드 NDK 설치 for Window
- Window 기준으로 설명
4. http://developer.android.com/sdk/ndk 에서 ndk 를 받는다
5. NDK 의 압축을 푼다. (cygwin/home/계정/하위폴더에 설치)
=> C:cygwinhomeAdministratorandroid-ndk-r8c
6. cygwinhome(사용자계정)Administrator.bashrc 파일수정
export ANDROID_NDK_ROOT= homeAdministratorandroid-ndk-r8c
8. 안드로이드 NDK 설치 for Window
6. 환경변수의 시스템변수에서 새로만들기
ANDROID_SDK 변수이름, 값은 설치한디렉토리
ANDROID_NDK 변수이름, 값은 설치한 디렉토리
7. 환경변수의 시스템변수-> PATH 값 설정
C:Program Files (x86)Androidandroid-sdktools;
C:Program Files (x86)Androidandroid-sdkplatform-tools;
C:cygwinhomeAdministratorandroid-ndk-r8c;
9. 안드로이드 JNI
- 자바에서 c/c++의 함수를 사용할수 있게 해주는 인터페이스
- JNI 규약
1. 메모리 관리
=> 자바는 달빅VM이 메모리 관리하지만 c/c++은 개발자가
메모리 관리를 책임지고 할당,해제 해야한다.
2. 타입선언
=>자바의 자료형을 c/c++에서 사용할때 자바자료형 앞에j를 붙인다.
(예: byte=>jbyte , int=>jint , float=>jfloat , object=>jobject)
=>자바의 배열형은 c/c++에서 Array를 붙여서 선언
(예: byte[] => jbyteArray)
3. 시그니처: 메소드를 만들때 사용하는 독특한 형태
=>원시타입은 알파벳 한글자로 표현(byte=>B , long=>J)
=>클래스앞에는 L,끝에는 세미콜론을 붙인다.
=>클래스명은 패키지명을 포함한 문자열로 지정
(예: Ljava/lang/String; => 자바의 String타입일경우)
=>배열은 선투에 '['을 붙여서 지정
(예: int[] => [I; , String[]=> [Ljava/lang/String;
11. 안드로이드 JNI
5. 메소드 정의 규칙
* 자바측
- 호출하는 함수를 선언할때 native 추가
- loadLibrary()를 이용해 호출할 라이브러리를 지정
public native int addVals(int a,int b); // native 붙인다
static{ System.loadLibrary("calcvals"); //libcalcvals.so 로드
}
* c/c++ 측
- 함수명은 java로 시작, 패키지명+클래스명+메서드명 연결하여 기술
- 인수중 처음2개의 인수는 JNIEnv,jObject타입으로 한다.
#include <jni.h>
jint java_com_solab_calcval_MainActivity_addVals(JNIEnv* env,jObject thiz , jint a, jint b)
{
return a+b;
}
=>co.solab.clacval 패키지에 있는 MainActivity 클래스의 addVals메서드 호출
12. 안드로이드 JNI
6. 리플렉션
=> c/c++에서 자바의 클래스에 접근할수 있는 기능(자바함수, 자바 변수 호출)
예: 문자열을 넣으면 숫자값으로 변화하는 자바클래스의 parseInt 함수 호출
jclass jklass= (*env)->FindClass(env,"java/lang/Integer");
- FindClass함수를 이용하여 java.lang.Integer클래스를 가져온다.
jmethodID jmethod = (*env)->GetStaticMethodID(env, jklass,"parseInt","(Ljava/lang/String);I");
- jmethod 에 "parseInt"와 인수, 반환값을 전달하고 해당 메서드의 ID를 구한다.
if(jmethod == NULL)return;
jint value =(*env)->CallStaticIntMethod(env, jklass,jmethod,strInt);
- jklass 클래스와 jmethod를 실행
예: intValue라는 int타입의 멤버변수를 가져오는 코드
jfieldID jfieldid = (*env)->GetFieldID(env, instance,"intValue","I");
- 세번째인수 : 가져올 변수명, 네번째인수: 가져올 변수타입
if(jfieldid = NULL)return;
jint val = (*env)->GetIntField(env,instance,jfieldid);
- GetXXXField 멤버변수를 int 타입으로 가져온다.
13. 안드로이드 JNI
7. C/C++에서 자바의 배열 사용법
- 자바의 배열을 가져올려면 GetXXXArrayElements(XXX)
- releaseArrayElements 배열메모리 영역 해제
8. C/C++에서 자바의 예외 발생
- ExceptionCheck 함수
- ExceptionOccurred 함수
- ExceptionClear 함수
9. 문자열
- UTF-8인코딩된 문자열
jstring jstr =(*env)->NewStringUTF(env, "펭귄");
jsize jlen =(*env)->GetStringLength(env,jstr);
const char* bytes =(*env)->GetStringUTFChars(env,jstr,NULL);
(*env)->ReleaseStringUTFChars(env,jstr,bytes);
14. 안드로이드 JNI
10. 대규모 메모리 처리
- 자바에서 C/C++로 이미지 데이터 보내기
1. 자바의 배열을 이용하기
: 자바에서 설정한 배열을 C/C++용으로 변환해서 저장
2. java.nio.ByteBuffer클래스 이용
: 변환과정 필요없어 처리시간 단축
NewDirectByteBuffer(JNIEnv * env,viud* address, jlong capacity)
-> 메모리 주소와 크기를 설정하고 새로운 인스턴스 생성
GetDirectBufferAddress(JNIEnv *env, jobject buf)
-> 인스턴스를 전달하고 시작주소를 반환한다.
GetDirectBufferCapacity(JNIEnv *env, jobject buf)
-> 인스턴스를 전달하고 크기를 반환한다.
11. 리틀 엔디언, 빅 엔디언
데이터를 메모리에 저장할때 상위비트부터 저장 : 빅에디언
데이터를 메모리에 저장할때 하위비트부터 저장 : 리틀에디언
=>달빅VM에서는 리틀에디언 사용
15. 안드로이드 JNI
12. Android.mk 파일
- 안드로이드 NDK를 이용하여 빌드할려면 Android.mk파일이 필요
- c/c++에서 makefile을 만들어서 빌드하지만 안드로이드는 Android.mk 파일만
듬
- 모듈을 만드는데 필요한 소스코드 및 링크할 라이브러리 지정
- 문법은 GNU make에 따라 작성
예: clacvlas.c에서 모듈인 libcalcvalc.so 파일을 생성
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
-> 이전의 모든 설정을 정리
LOCAL_MODULE := calcvals
-> 생성할 모듈 지정 ,libcalcvalc.so 라는 공유라이브러리가 생성
LOCAL_SRC_FILES := calcvals.c
-> 생성된 모듈을 빌드하는데 필요한 소스파일을 지정
include $(BUILD_SHARED_LIBRARY)
-> 이 라이브러리는 공유라이브러리로 생성
16. 안드로이드 JNI
- 자바에서 C 함수 호출하기
* int타입만 사용해 사칙연산 메소드 만들기 실습 *
1. 프로젝트 만들기
- cygwin/home/user계정/ 폴더에 프로젝트를 생성한다.
- 이클립스에서 프로젝트 생성후 소스코드와 Android.mk 파일위한 jni폴더 추가
2. jni폴터 밑에 Android.mk 파일 생성
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := calcvals.c
LOCAL_MODULE := calcvals
include $(BUILD_SHARED_LIBRARY)
=> 이 파일에 의해 calcvals.c가 빌드되고 libcalcvals.so파일이 만들어진다.
17. 안드로이드 JNI
3. MainActivity.java 변경
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
StringBuffer buf = new StringBuffer();
TextView tv = new TextView(this);
int a=10;
int b=2;
int val = addVals(a,b);
buf.append("a+b="+String.valueOf(val)+"n");
val = subVals(a,b);
buf.append("a-b="+String.valueOf(val)+"n");
val = mulVals(a,b);
buf.append("a*b="+String.valueOf(val)+"n");
val = divVals(a,b);
buf.append("a/b="+String.valueOf(val)+"n");
tv.setText(buf.toString());
setContentView(tv);
}
public native int addVals(int a, int b);
public native int subVals(int a, int b);
public native int mulVals(int a, int b);
public native int divVals(int a, int b);
static{
System.loadLibrary("calcvals");
}
18. 안드로이드 JNI
4. calcvals.h 파일 생성
#include <jni.h>
#ifndef _addvals_h
#define _addvals_h
#ifdef __cplusplus
extern "C"
{
#endif
jint Java_com_solab_jnicalc_MainActivity_addVals(JNIEnv* env,jobject thiz,jint a, jint
jint Java_com_solab_jnicalc_MainActivity_subVals(JNIEnv* env,jobject thiz,jint a, jint
jint Java_com_solab_jnicalc_MainActivity_mulVals(JNIEnv* env,jobject thiz,jint a, jint
jint Java_com_solab_jnicalc_MainActivity_divVals(JNIEnv* env,jobject thiz,jint a, jint
#ifdef __cplusplus
}
#endif
#endif
19. 안드로이드 JNI
5. calcvals.c 파일 생성
#include "calcvals.h"
jint Java_com_solab_jnicalc_MainActivity_addVals(JNIEnv* env,jobject thiz,jint a, jint b)
{
return a+b;
}
jint Java_com_solab_jnicalc_MainActivity_subVals(JNIEnv* env,jobject thiz,jint a, jint b)
{
return a-b;
}
jint Java_com_solab_jnicalc_MainActivity_mulVals(JNIEnv* env,jobject thiz,jint a, jint b)
{
return a*b;
}
jint Java_com_solab_jnicalc_MainActivity_divVals(JNIEnv* env,jobject thiz,jint a, jint b)
{
return a/b;
}
20. 안드로이드 JNI
6. 빌드
- 먼저, 프로젝트 폴더로 이동하여 ndk-build명령을 실행한다.
- 빌드에 성공하면 libs/armeabi 폴더 아래에 libcalcvals.so생성됨
- 이클립스에서 project -> clean 후에 프로그램 실행