기록

[GPT가 알려주는] JniLib란? 본문

잡동사니/GPT가 알려주는

[GPT가 알려주는] JniLib란?

heylo 2025. 12. 5. 15:48

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)이 실제 하는 일

앱이 실행될 때:

  1. 안드로이드 시스템이 ABI(arm64 등)를 확인하고
  2. jniLibs 안에 있는 .so 파일을 로드한 뒤
  3. 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 설정

전부 만들어 줄게!