기록
[GPT가 알려주는] JniLib란? 본문
JNI 쪽 개발할 때 자주 보게 되는 jniLib(또는 jniLibs)는 안드로이드에서 **Native 라이브러리(.so 파일)**을 앱 안에 포함시키기 위해 사용하는 폴더/개념이야.
아주 쉽게 말하면:
✅ 📌 jniLib = 앱 안에 포함된 .so 네이티브 라이브러리 묶음
🔍 1. JNI(Java Native Interface)란?
안드로이드 앱(Java/Kotlin)이
C/C++ 코드(NDK)를 호출하기 위해 존재하는 인터페이스.
즉:
Java → JNI → C/C++(.so) 라이브러리 호출
이 구조로 돌아간다.
🔍 2. jniLibs 폴더란?
안드로이드 스튜디오 앱 프로젝트 내부에서 다음 경로에 존재:
app/src/main/jniLibs/
이 폴더 아래 ABI별 폴더를 넣어:
jniLibs/
├── arm64-v8a/
│ └── libsomething.so
├── armeabi-v7a/
│ └── libsomething.so
└── x86_64/
└── libsomething.so
여기 들어가는 .so 파일들을 apk 빌드 시 그대로 포함함.
즉, 앱에서 사용하는 native 라이브러리 저장소.
🔍 3. jniLib(또는 jniLibs)이 실제 하는 일
앱이 실행될 때:
- 안드로이드 시스템이 ABI(arm64 등)를 확인하고
- jniLibs 안에 있는 .so 파일을 로드한 뒤
- Java 코드에서 System.loadLibrary("something")으로 사용 가능하게 됨
즉:
✔ .so 파일을 앱 APK 내부에 넣는 디렉터리
✔ Java/Kotlin이 native 함수를 호출할 수 있게 해주는 파일
🔍 4. DDS, CANService, HAL 개발에서 JNI는 언제 등장하냐?
아래 상황에서 등장함:
- Java/Kotlin 앱이 Native HAL(C++ DDSService/CANService)을 호출할 때
- AIDL이 C++ 구현과 연동될 때
- Native FastDDS API를 Android 앱에서 직접 호출할 때
예를 들어:
Java
public class NativeDDS {
static {
System.loadLibrary("dds_jni");
}
public native void publishData(byte[] data);
}
C++
extern "C"
JNIEXPORT void JNICALL
Java_com_example_NativeDDS_publishData(JNIEnv* env, jobject thiz, jbyteArray data){
// 실제 DDS publish 동작
}
이런 경우 dds_jni.so가 jniLibs 안에 있어야 함.
🔍 5. jniLibs와 system/lib64 의 차이
위치 용도
| app/src/main/jniLibs/ | 앱 내부에 포함되는 .so |
| /system/lib64/ | AOSP 시스템 이미지에 포함된 .so |
| /vendor/lib64/ | Vendor HAL .so |
DDS 같은 system-level 서비스는 보통 system/lib64나 vendor/lib64에 들어가고,
앱에서 직접 native 연동을 하면 jniLibs를 사용하게 됨.
⭐ 한 문장 요약
jniLibs = 앱 APK 안에 포함되는 native (.so) 라이브러리 폴더이며, Java가 C/C++ 코드를 호출하기 위해 필요한 파일들이다.
필요하면:
- JNI 코드 예제
- 앱에서 DDSService를 JNI로 직접 호출하는 구조
- jniLibs 자동 복사 Gradle 설정
전부 만들어 줄게!
'잡동사니 > GPT가 알려주는' 카테고리의 다른 글
| [GPT가 알려주는] AIDL 파일 (0) | 2025.12.08 |
|---|---|
| [GPT가 알려주는] JVM 언어란? (0) | 2025.12.05 |
| [GPT가 알려주는] service & system 구조 파악 (dds 포팅 시도 중) (1) | 2025.12.05 |
| [GPT가 알려주는] X86 vs Arm64 (0) | 2025.12.04 |
| [GPT가 알려주는] AIDL과 HIDL (0) | 2025.12.04 |