Korea Android
신입 안드로이드 개발자의
AI 스타트업 생존기
(+ Native C++ Code를
Android에서 사용해보기)
김도엽
ZETIC.ai
super.init(version=6)
Slide 2
Slide 2 text
게임 개발자에서 안드로이드 개발자로
Slide 3
Slide 3 text
우테코에서 나는..
도메인 객체에 id..?
Slide 4
Slide 4 text
ZETIC.ai 합류
아이템 좋아 보임
당장 먹고 살아야함
졸업 후 공백 싫음
처우 나쁘지 않아 보임
취업 안됨 (서류 0합)
Slide 5
Slide 5 text
ZETIC.ai 합류
아이템 좋아 보임
당장 먹고 살아야함
졸업 후 공백 싫음
취업 안됨 (서류 0합)
사실 별 생각
없음!
처우 나쁘지 않아 보임
Slide 6
Slide 6 text
AI? 난 모름...
이것 뭐에요..?
Slide 7
Slide 7 text
다행인 점
범용 온디바이스 AI
모델 “추론”
라이브러리 개발
모델을 직접
설계하고 개발할
필요는 없음
Slide 8
Slide 8 text
ʻ내가 모르는 것’이 아니라 ʻ내가 알고 있는 것’에 집중하자
게임 개발
C++, 컴퓨터 공학,
최적화, 디버깅,
CMake, 빌드
안드로이드 개발
설계, Kotlin,
Android, JNI
온디바이스 AI 추론
서비스 개발!
+ 기초적인
인공지능 지식
Slide 9
Slide 9 text
ZETIC.ai에서 나는..
Segmentation
Fault요?
“우리도 결국엔 usability 확장을 지금 당장 LLM만
우선적으로 hugging face support달고있지만, 여러모델들
지난번 도엽님이 whisper모델 한것처럼 다
huggingface에서 출발할 수 있게도 좀 봐야할것 같아요”
memcpy(),
malloc() 너 나가
객체지향..? 클린
코드..? 함수형..?
어이 김씨 거기
메모리 누수나 막아
그러니까
Quantization이
뭐냐면..
오 어제 한명 접속했어요
Slide 10
Slide 10 text
개발 세계관의 확장
Slide 11
Slide 11 text
내 마음속의 로드맵..
테스트 인프라 실 사용자 확보
Slide 12
Slide 12 text
Native C++ Code를
Android에서 사용해보기
Korea Android
super.init(version=6)
Slide 13
Slide 13 text
온디바이스 AI의 기술적 요구사항
1. 클라우드가 아닌 디바이스에서 AI
모델 실행
2. 고성능 모델의 최적화 필요
3. 컴퓨팅 자원의 제한적 사용
4. C++로 작성된 외부 라이브러리 사용
웬만한 일은 C++에서!
Slide 14
Slide 14 text
온디바이스 AI의 기술적 요구사항
최적화해야한다
빌드해야한다
야껴야한다
모델 전/후처리
Slide 15
Slide 15 text
CMake
1. 빌드 파일 자동 생성
2. MakeFile, Visual Studio Solution,
XCode 용 빌드 파일 생성도 지원
3. Gradle에서 지원
4. https://cmake.org/
CMakeLists.txt
Slide 16
Slide 16 text
CMake
Foo.cpp
Foo.h
Slide 17
Slide 17 text
CMake
Directory Structure Shell
Slide 18
Slide 18 text
쉘 스크립트와 함께
1. 여러 아키텍처로 라이브러리 빌드
2. 빌드 전/후처리
3. 복잡한 CMake 옵션 설정
Slide 19
Slide 19 text
Android NDK (Native Development Kit)
1. Android에서 C, C++ 코드를 사용할 수 있게 해주는 일련의 도구 모음
2. 네이티브 코드 빌드, 실행
3. JNI를 통해 Java(Kotlin) 코드와 상호작용
4. Java GC 관리 대상 아님
Slide 20
Slide 20 text
JNI (Java Native Interface)
1. JNI는 Java와 네이티브 코드(C/C++) 간의 상호작용을 위한 인터페이스
2. Java VM (Dalvik/ART)과 네이티브 코드 간의 함수 호출 규약 정의
3. Java 객체 생성 및 조작
4. Java <-> Native 간 데이터 변환 (Marshalling & Unmarshalling)
5. 네이티브 스레드 연결
6. JNIEnv 구조체
Slide 21
Slide 21 text
함수 호출 규약
Java 코드와 C/C++ 코드 간에 상호작용을 가능하게 하는 인터페이스 제공
Java_<패키지명>_<클래스명>_<메서드명>
Slide 22
Slide 22 text
JNIEnv 구조체
1. Java 객체 생성, 조작
2. Java 객체 참조 관리 (LocalRef, GlobalRef, WeakGlobalRef)
3. Marshalling & Unmarshalling
4. 네이티브 스레드 연결
Slide 23
Slide 23 text
Android Studio에서 설정
1. Gradle에서 CMake 빌드 설정
2. JNI 메소드 생성
Slide 24
Slide 24 text
아키텍쳐 제안
Kotlin Class Wrapper Class JNI (C++) Native Code
Kotlin Class Wrapper Class
Slide 25
Slide 25 text
Kotlin Class Wrapper Class JNI (C++) Native Code
아키텍쳐 제안
JNI (C++) Native Code
Slide 26
Slide 26 text
No content
Slide 27
Slide 27 text
Overview
CMake로 빌드되는 C++ 프로젝트를
Gradle에 포함시켜 NDK로 빌드하고
런타임에 로드, JNI로 Java (Kotlin)과
상호작용
Slide 28
Slide 28 text
C++ 쓰면 다 되는거 아닌가요?
1. Java <-> 네이티브 코드 데이터 변환도 비용이 발생한다.
2. Java의 GC는 네이티브 코드에서 할당한 메모리는 해제하지 못한다.
3. 반대로 네이티브에서 해제된 메모리에 접근 할 위험도 존재
a. 메모리 생명주기 관리