SlideShare une entreprise Scribd logo
1  sur  23
Télécharger pour lire hors ligne
Clova Speech | 강한용
NDK로안드로이드에 C++끼얹기
강한용
- LINE ARCADE 개발 및 출시 (2016. 3 ~ 2017. 2)
- 네이버 Clova Speech ML Engineer (2017. 3 ~ 현재)
모바일 앱의 흐름
- 새로운 사용자 가치
- 프라이버시 이슈
Deep Learning, VR, AR 등 신기술 등장
- JNI를 이용하여 안드로이드에서 네이티브 코드를 구동할 수 있게 해주는 Development Kit
- 다양한 아키텍처에 대한 Cross Compile을 가능하도록 하는 것이 핵심 기능
- 이외에도 안드로이드 SDK를 지원하기 위한 시스템 헤더 및 라이브러리 제공
NDK 정의
NDK란 ?
딥러닝 추론, 이미지 처리 등 높은 성능을 필요로 하는 경우
ex. Deep Learning Framework는 NDK 사용하여 빌드
(tf-lite, OnnxRuntime, PytorchMobile)
02. 코드 재사용
C++ 모듈을 aOS, iOS에서 동시 사용 가능
03. 하드웨어 제어
하드웨어 드라이버 제어
NDK 장점
NDK 사용하는 이유
01. 성능
언제나 모든 플랫폼에서 사용 가능한지를 체크해야 한다.
02. 안정성 결여
네이티브 메소드는 자바 메소드처럼 보호를 받지 못한다.
메모리 추적, 포인터 사용 등에 의한 C++의 버그가 발생한다.
03. 보안에 취약
.so와 같은 동적 라이브러리의 호출은 자바 시큐리티 메니저의 의도에 반한다.
NDK 단점
NDK 사용 안 하는 이유
01. 이식성 결여
04. 복잡성 증가
프로그램을 설계할 때, 프로젝트를 진행할 때, 나중에 유지 보수할 때 복잡할 수 있다.
libgps.so
Location Manager
gps 드라이버
In-depth
Android
안드로이드 톺아보기
JNI
JNI 정의
JNI 란?
JNI
C JAVA
Functions
Libraries
Exceptions
Classes
VM
JNI 정의
JNI 란?
native printHello()
Java_HelloJNI_printHello()
자바 가상 머신
- System.load()를 호출하면 VM이 native로 선언된 메소드를 로딩한 라이
브러리의 native 함수로 연결
- libfubar.so를 로드하려면 fubar
RegisterNatives
- JNI_OnLoad를 추가해 놓으면 JNI_OnLoad만 연결
- 네이티브 함수 코드를 클래스의 native 메소드에 연결
- VM이 링크하는 것보다 훨씬 능률적이고 빠름
JNI 정의
JNI 란?
native printHello() Java_HelloJNI_printHello()
JVM
C App
RegisterNative 함수를 이용하여
JVM에 링크
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return JNI_ERR;
}
// Find your class. JNI_OnLoad is called from the correct class loader context for this to work.
jclass c = env->FindClass("com/example/app/package/MyClass");
if (c == nullptr) return JNI_ERR;
// Register your class' native methods.
static const JNINativeMethod methods[] = {
{"nativeFoo", "()V", reinterpret_cast<void*>(nativeFoo)},
{"nativeBar", "(Ljava/lang/String;I)Z", reinterpret_cast<void*>(nativeBar)},
};
int rc = env->RegisterNatives(c, methods, sizeof(methods)/sizeof(JNINativeMethod));
if (rc != JNI_OK) return rc;
return JNI_VERSION_1_6;
}
JNI 정의
JNINativeMethod 구조체
typedef struct {
char *name;
char *signature;
void *fnPtr;
} JNINativeMethod
jint RegisterNatives(JNIEnv *env,
Jclass clazz,
Const JNINativeMethod
*methods,
Jint nMethods);
JNIEnv interface pointer
- 네이티브 메소드의 첫 번째 인자로 전달됨
- 현재 쓰레드 에서만 유효 (다른 쓰레드에서 사용할 수 없음)
- 함수 테이블의 포인터를 갖고 있음
- 네이티브 메소드는 JNI 함수를 통해 Java VM의 데이터 구조에 접근 가능
Pointer
(Internal
virtual
machine data
structures)
Pointer
Pointer
Pointer
…
an interface function
an interface function
an interface function
JNIEnv*
JNI 정의
스트링을 줄게.
근데 Java.lang.String
형 알아?
몰라!
하지만
GetStringUTFChars를
통해 알 수 있어
이렇게 얻어온 스트링은
ReleaseStringUTFChar
s로 해제 해줘야 해
#include <jni.h>
#include "MessageType.h”
#include <stdio.h>
JNIEXPORT jstring JNICALL Java_MessageType_printMessage(JNIEnv* env, jobject obj, jstring msg) {
const char *str = (*env)->GetStringUTFChars(env, msg, 0);
printf("%s", str);
(*env)->ReleaseStringUTFChars(env, msg, str);
return (*env)->NewStringUTF(env, “Hello JNI”);
}
JNI 정의
ABI (Application Binary Interface)
ABI 지원되는 명령 세트 예시 기기
armeabi-v7a armeabi
Thumb-2
VFPv3-D16
갤럭시 S5
arm64-v8a AArch64 갤럭시 S5 이상
x86 x86
MMX
SSE/2/3
SSSE3
x86_64 x86-64
MMX
SSE/2/3
SSSE3
SSE4.1, 4.2
POPCNT
NDK OS 변형 호스트 태그
macOS darwin-x86_64
Linux linux-x86_64
32비트 Windows windows
64비트 Windows windows-x86_64
ABI 타깃
armeabi-v7a armv7a-linux-androidabi
arm64-v8a aarch64-linux-android
x86 i686-linux-android
x86-64 x86_64-linux-android
ABI (Application Binary Interface)
ndk-build vs CMake
- 결과물은 같습니다. 더 편한 걸 쓰면 됩니다.
- 그러나 선택해야 한다면 CMake를 추천합니다.
- iOS, C++ 빌드 시 CMakeLists.txt를 재사용할 수 있습니다.
- 비교적 친숙하고 널리 쓰입니다.
- 안드로이드 기본 빌드는 CMake입니다.
android {
...
defaultConfig {...}
buildTypes {...}
// Encapsulates your external native build configurations.
externalNativeBuild {
// Encapsulates your CMake build configurations.
cmake {
// Provides a relative path to your CMake build script.
path "CMakeLists.txt"
}
}
}
JNI Heap 관리
- JNI 참조는 네이티브 코드에 의해 수동으로 관리되므로 네이티브 코드에서
사용하는 자바 개체가 너무 오랫동안 연결된 상태로 유지될 수 있습니다.
JNI 참조가 먼저 명시적으로 삭제되지 않고 취소되면 자바 힙의 일부
개체에 도달하지 못할 수도 있습니다. 또한 글로벌 JNI 참조 한도를 소진할
수도 있습니다.
JNI Heap 관리
References
- 안드로이드 공식 문서
(https://developer.android.com/ndk/guides)
- JNI Tutorial
(https://sungcheol-kim.gitbook.io/jni-tutorial)
200819 NAVER TECH CONCERT 04_NDK로 안드로이드에 C++ 끼얹기

Contenu connexe

Tendances

Tendances (20)

Chapter 9 - convolutional networks
Chapter 9 - convolutional networksChapter 9 - convolutional networks
Chapter 9 - convolutional networks
 
문자 단위의 Neural Machine Translation
문자 단위의 Neural Machine Translation문자 단위의 Neural Machine Translation
문자 단위의 Neural Machine Translation
 
자연어5 | 1차강의
자연어5 | 1차강의자연어5 | 1차강의
자연어5 | 1차강의
 
Neural Machine Translation 기반의 영어-일본어 자동번역
Neural Machine Translation 기반의 영어-일본어 자동번역Neural Machine Translation 기반의 영어-일본어 자동번역
Neural Machine Translation 기반의 영어-일본어 자동번역
 
REALM
REALMREALM
REALM
 
A Beginner's guide to understanding Autoencoder
A Beginner's guide to understanding AutoencoderA Beginner's guide to understanding Autoencoder
A Beginner's guide to understanding Autoencoder
 
Character-Aware Neural Language Models
Character-Aware Neural Language ModelsCharacter-Aware Neural Language Models
Character-Aware Neural Language Models
 
쫄지말자딥러닝2 - CNN RNN 포함버전
쫄지말자딥러닝2 - CNN RNN 포함버전쫄지말자딥러닝2 - CNN RNN 포함버전
쫄지말자딥러닝2 - CNN RNN 포함버전
 
파이썬과 자연어 1 | Word Cloud
파이썬과 자연어 1 | Word Cloud파이썬과 자연어 1 | Word Cloud
파이썬과 자연어 1 | Word Cloud
 
모두의 JIT 컴파일러
모두의 JIT 컴파일러모두의 JIT 컴파일러
모두의 JIT 컴파일러
 
Multithread programming 20151206_서진택
Multithread programming 20151206_서진택Multithread programming 20151206_서진택
Multithread programming 20151206_서진택
 
Denoising auto encoders(d a)
Denoising auto encoders(d a)Denoising auto encoders(d a)
Denoising auto encoders(d a)
 
서울 R&D 캠퍼스 자연어 수업자료
서울 R&D 캠퍼스 자연어 수업자료서울 R&D 캠퍼스 자연어 수업자료
서울 R&D 캠퍼스 자연어 수업자료
 
알고리즘 시각화 라이브러리 ipytracer 개발기
알고리즘 시각화 라이브러리 ipytracer 개발기알고리즘 시각화 라이브러리 ipytracer 개발기
알고리즘 시각화 라이브러리 ipytracer 개발기
 
메이크챗봇 자연어기초
메이크챗봇 자연어기초메이크챗봇 자연어기초
메이크챗봇 자연어기초
 
Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용
Python과 Tensorflow를 활용한  AI Chatbot 개발 및 실무 적용Python과 Tensorflow를 활용한  AI Chatbot 개발 및 실무 적용
Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용
 
Masked Sequence to Sequence Pre-training for Language Generation
Masked Sequence to Sequence Pre-training for Language GenerationMasked Sequence to Sequence Pre-training for Language Generation
Masked Sequence to Sequence Pre-training for Language Generation
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
학교에서 배우지 않는 C
학교에서 배우지 않는 C학교에서 배우지 않는 C
학교에서 배우지 않는 C
 
파이썬을 활용한 자연어 분석 - 2차
파이썬을 활용한 자연어 분석 - 2차파이썬을 활용한 자연어 분석 - 2차
파이썬을 활용한 자연어 분석 - 2차
 

Similaire à 200819 NAVER TECH CONCERT 04_NDK로 안드로이드에 C++ 끼얹기

Manage book project
Manage book projectManage book project
Manage book project
Ann Byung Hyun
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
효준 강
 
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
Sang Don Kim
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012
Daum DNA
 

Similaire à 200819 NAVER TECH CONCERT 04_NDK로 안드로이드에 C++ 끼얹기 (20)

좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기
 
20160414 ROS 2차 강의 (for 아스라다 팀)
20160414 ROS 2차 강의 (for 아스라다 팀)20160414 ROS 2차 강의 (for 아스라다 팀)
20160414 ROS 2차 강의 (for 아스라다 팀)
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
Manage book project
Manage book projectManage book project
Manage book project
 
Manage book project
Manage book projectManage book project
Manage book project
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
 
20160420 ROS 3차 강의 (for 아스라다 팀)
20160420 ROS 3차 강의 (for 아스라다 팀)20160420 ROS 3차 강의 (for 아스라다 팀)
20160420 ROS 3차 강의 (for 아스라다 팀)
 
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
 
Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기
 
The Future of .NET and C#
The Future of .NET and C#The Future of .NET and C#
The Future of .NET and C#
 
강의자료 2
강의자료 2강의자료 2
강의자료 2
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012
 

Plus de NAVER Engineering

Plus de NAVER Engineering (20)

React vac pattern
React vac patternReact vac pattern
React vac pattern
 
디자인 시스템에 직방 ZUIX
디자인 시스템에 직방 ZUIX디자인 시스템에 직방 ZUIX
디자인 시스템에 직방 ZUIX
 
진화하는 디자인 시스템(걸음마 편)
진화하는 디자인 시스템(걸음마 편)진화하는 디자인 시스템(걸음마 편)
진화하는 디자인 시스템(걸음마 편)
 
서비스 운영을 위한 디자인시스템 프로젝트
서비스 운영을 위한 디자인시스템 프로젝트서비스 운영을 위한 디자인시스템 프로젝트
서비스 운영을 위한 디자인시스템 프로젝트
 
BPL(Banksalad Product Language) 무야호
BPL(Banksalad Product Language) 무야호BPL(Banksalad Product Language) 무야호
BPL(Banksalad Product Language) 무야호
 
이번 생에 디자인 시스템은 처음이라
이번 생에 디자인 시스템은 처음이라이번 생에 디자인 시스템은 처음이라
이번 생에 디자인 시스템은 처음이라
 
날고 있는 여러 비행기 넘나 들며 정비하기
날고 있는 여러 비행기 넘나 들며 정비하기날고 있는 여러 비행기 넘나 들며 정비하기
날고 있는 여러 비행기 넘나 들며 정비하기
 
쏘카프레임 구축 배경과 과정
 쏘카프레임 구축 배경과 과정 쏘카프레임 구축 배경과 과정
쏘카프레임 구축 배경과 과정
 
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
 
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
 
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
 
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
 
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
 
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
 
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
 
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
 
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
 
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
 
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
 
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
 

200819 NAVER TECH CONCERT 04_NDK로 안드로이드에 C++ 끼얹기

  • 1.
  • 2. Clova Speech | 강한용 NDK로안드로이드에 C++끼얹기
  • 3. 강한용 - LINE ARCADE 개발 및 출시 (2016. 3 ~ 2017. 2) - 네이버 Clova Speech ML Engineer (2017. 3 ~ 현재)
  • 4. 모바일 앱의 흐름 - 새로운 사용자 가치 - 프라이버시 이슈 Deep Learning, VR, AR 등 신기술 등장
  • 5. - JNI를 이용하여 안드로이드에서 네이티브 코드를 구동할 수 있게 해주는 Development Kit - 다양한 아키텍처에 대한 Cross Compile을 가능하도록 하는 것이 핵심 기능 - 이외에도 안드로이드 SDK를 지원하기 위한 시스템 헤더 및 라이브러리 제공 NDK 정의 NDK란 ?
  • 6. 딥러닝 추론, 이미지 처리 등 높은 성능을 필요로 하는 경우 ex. Deep Learning Framework는 NDK 사용하여 빌드 (tf-lite, OnnxRuntime, PytorchMobile) 02. 코드 재사용 C++ 모듈을 aOS, iOS에서 동시 사용 가능 03. 하드웨어 제어 하드웨어 드라이버 제어 NDK 장점 NDK 사용하는 이유 01. 성능
  • 7. 언제나 모든 플랫폼에서 사용 가능한지를 체크해야 한다. 02. 안정성 결여 네이티브 메소드는 자바 메소드처럼 보호를 받지 못한다. 메모리 추적, 포인터 사용 등에 의한 C++의 버그가 발생한다. 03. 보안에 취약 .so와 같은 동적 라이브러리의 호출은 자바 시큐리티 메니저의 의도에 반한다. NDK 단점 NDK 사용 안 하는 이유 01. 이식성 결여 04. 복잡성 증가 프로그램을 설계할 때, 프로젝트를 진행할 때, 나중에 유지 보수할 때 복잡할 수 있다.
  • 9. JNI 정의 JNI 란? JNI C JAVA Functions Libraries Exceptions Classes VM
  • 10. JNI 정의 JNI 란? native printHello() Java_HelloJNI_printHello() 자바 가상 머신 - System.load()를 호출하면 VM이 native로 선언된 메소드를 로딩한 라이 브러리의 native 함수로 연결 - libfubar.so를 로드하려면 fubar RegisterNatives - JNI_OnLoad를 추가해 놓으면 JNI_OnLoad만 연결 - 네이티브 함수 코드를 클래스의 native 메소드에 연결 - VM이 링크하는 것보다 훨씬 능률적이고 빠름
  • 11. JNI 정의 JNI 란? native printHello() Java_HelloJNI_printHello() JVM C App RegisterNative 함수를 이용하여 JVM에 링크
  • 12. JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env; if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { return JNI_ERR; } // Find your class. JNI_OnLoad is called from the correct class loader context for this to work. jclass c = env->FindClass("com/example/app/package/MyClass"); if (c == nullptr) return JNI_ERR; // Register your class' native methods. static const JNINativeMethod methods[] = { {"nativeFoo", "()V", reinterpret_cast<void*>(nativeFoo)}, {"nativeBar", "(Ljava/lang/String;I)Z", reinterpret_cast<void*>(nativeBar)}, }; int rc = env->RegisterNatives(c, methods, sizeof(methods)/sizeof(JNINativeMethod)); if (rc != JNI_OK) return rc; return JNI_VERSION_1_6; } JNI 정의 JNINativeMethod 구조체 typedef struct { char *name; char *signature; void *fnPtr; } JNINativeMethod jint RegisterNatives(JNIEnv *env, Jclass clazz, Const JNINativeMethod *methods, Jint nMethods);
  • 13. JNIEnv interface pointer - 네이티브 메소드의 첫 번째 인자로 전달됨 - 현재 쓰레드 에서만 유효 (다른 쓰레드에서 사용할 수 없음) - 함수 테이블의 포인터를 갖고 있음 - 네이티브 메소드는 JNI 함수를 통해 Java VM의 데이터 구조에 접근 가능 Pointer (Internal virtual machine data structures) Pointer Pointer Pointer … an interface function an interface function an interface function JNIEnv*
  • 14. JNI 정의 스트링을 줄게. 근데 Java.lang.String 형 알아? 몰라! 하지만 GetStringUTFChars를 통해 알 수 있어 이렇게 얻어온 스트링은 ReleaseStringUTFChar s로 해제 해줘야 해
  • 15. #include <jni.h> #include "MessageType.h” #include <stdio.h> JNIEXPORT jstring JNICALL Java_MessageType_printMessage(JNIEnv* env, jobject obj, jstring msg) { const char *str = (*env)->GetStringUTFChars(env, msg, 0); printf("%s", str); (*env)->ReleaseStringUTFChars(env, msg, str); return (*env)->NewStringUTF(env, “Hello JNI”); } JNI 정의
  • 16. ABI (Application Binary Interface) ABI 지원되는 명령 세트 예시 기기 armeabi-v7a armeabi Thumb-2 VFPv3-D16 갤럭시 S5 arm64-v8a AArch64 갤럭시 S5 이상 x86 x86 MMX SSE/2/3 SSSE3 x86_64 x86-64 MMX SSE/2/3 SSSE3 SSE4.1, 4.2 POPCNT
  • 17. NDK OS 변형 호스트 태그 macOS darwin-x86_64 Linux linux-x86_64 32비트 Windows windows 64비트 Windows windows-x86_64 ABI 타깃 armeabi-v7a armv7a-linux-androidabi arm64-v8a aarch64-linux-android x86 i686-linux-android x86-64 x86_64-linux-android ABI (Application Binary Interface)
  • 18. ndk-build vs CMake - 결과물은 같습니다. 더 편한 걸 쓰면 됩니다. - 그러나 선택해야 한다면 CMake를 추천합니다. - iOS, C++ 빌드 시 CMakeLists.txt를 재사용할 수 있습니다. - 비교적 친숙하고 널리 쓰입니다. - 안드로이드 기본 빌드는 CMake입니다.
  • 19. android { ... defaultConfig {...} buildTypes {...} // Encapsulates your external native build configurations. externalNativeBuild { // Encapsulates your CMake build configurations. cmake { // Provides a relative path to your CMake build script. path "CMakeLists.txt" } } }
  • 20. JNI Heap 관리 - JNI 참조는 네이티브 코드에 의해 수동으로 관리되므로 네이티브 코드에서 사용하는 자바 개체가 너무 오랫동안 연결된 상태로 유지될 수 있습니다. JNI 참조가 먼저 명시적으로 삭제되지 않고 취소되면 자바 힙의 일부 개체에 도달하지 못할 수도 있습니다. 또한 글로벌 JNI 참조 한도를 소진할 수도 있습니다.
  • 22. References - 안드로이드 공식 문서 (https://developer.android.com/ndk/guides) - JNI Tutorial (https://sungcheol-kim.gitbook.io/jni-tutorial)