보통 크게 2 가지로 나뉜다.
정적 라이브러리 (.a)
동적 라이브러리(.so)
정적 라이브러리는 object file의 모음이며, .a 확장자를 가진다. 컴파일 시 실행 파일에 포함된다.
동적 라이브러리는 .so 확장자를 가지며 컴파일 시에 실행 파일에 적재되지 않으며, 런타임에 필요할 때 로드하여 사용한다.
또한 제공하는 ABI(Application Binary Interface)도 armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64로 다양하다.
대부분의 안드로이드에서는 ARM 계열의 CPU를 사용하기 때문에 안드이드 NDK를 빌드 시에 armeabi, armeabi-v71, arm64-v8a로 대부분 빌드된다.
일부기기에서는 x86용이 적용되기도 한다.
ABI는 응용 프로그램과 운영체제 또는 응용 프로그램과 해당 라이브러리, 응용 프로그램의 구성요소 사이에서 사용되는 저 수준의 바이너리 인터페이스 이다.
안드로이드에서 보자면 CPU에 따라 바이너리가 달라지는 정도로 이해하면 된다.
라이브 형태로 만들어진 파일들(.so, .a) APK내에 포함되며 앱이 디바이스에 설치될 때, CPU버전에 분기되어 해당 라이브러리가 설치되는 형식이다.
Native 함수들이 불리는 순서는 System.loadLibrary함수를 통해 .so 파일이 로드 되고, Activity의 onCreate() 함수가 시작되며 Native 함수가 호출된다.
이때 JNI(Java Native Interface)기법이 사용되며, 정해진 인터페이스가 있다.
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_nanamare_mac_mobilenet_MobileNetNCNN_init(JNIEnv *env, jobject instance,
jbyteArray params_, jbyteArray bin_,
jbyteArray labels_)
반환값 (jboolean) + 자바 고정 값 (Java) + 프로젝트 패키지 명 (com.nanamare.mac.mobilnet) + 호출 클래스 명 (MobileNetNCNN) + Native 함수명 (init) 으로 구성된다.
안드로이드에서도 우리가 c언어 시간에 배운 컴파일 하고 빌드하는 순서와 같이 실행된다.
.c(원시 프로그램) ---컴파일---> .o(목적 프로그램) ---링킹---> .so(실행 프로그램)
위의 파일들은 안드로이드 빌드시에 app 모듈 아래에 /build/intermediates 내에 objectFiles 폴더와 binaries폴더에서 오브젝트 파일과 네티이브 라이브러리를 각각 파일로 확인할 수 있다.
'Android > Development Tips' 카테고리의 다른 글
[Android] Foreground 활용하기, 터치 이벤트 쉽게 적용하기 (0) | 2018.11.08 |
---|---|
[펌] Activity 스택 intent flag (0) | 2018.07.12 |
Measuring of String in android (0) | 2018.02.12 |
안드로이드 프로세스와 스레드 (0) | 2017.12.03 |
액티비티와 생명주기 (0) | 2017.12.03 |