Spring Boot에서 JNI 라이브러리 로드하는 방법

조제·2024년 12월 16일
0

JNI(Java Native Interface)는 Java 코드에서 네이티브 코드(C, C++)를 호출할 수 있도록 지원하는 기술입니다.


1. JNI 라이브러리 로드 개요

Java에서 네이티브 라이브러리를 로드하기 위해 System.loadLibrary("라이브러리명") 메서드를 사용합니다.

OS별로 사용가능한 파일이 다릅니다.

  • Windows: .dll
  • Linux: .so
  • Mac: .dylib

2. 프로젝트에 JNI 라이브러리 포함하기

(1) 라이브러리 경로 설정

Java 애플리케이션에서 JNI 라이브러리를 로드하려면 라이브러리 경로를 JVM에 알려줘야 합니다. 이는 java.library.path 시스템 속성을 설정하여 가능합니다.

java -jar -Dspring.profiles.active=dev -Djava.library.path=/home/app/jniLibs app.jar

(2) Docker 환경에서 경로 설정

Docker 컨테이너에 JNI 라이브러리를 포함하려면 libs 폴더를 생성하고 라이브러리를 추가한 뒤, Dockerfile을 수정합니다.

Dockerfile 예시

  1. COPY /libs /app/libs : 프로젝트의 libs 폴더를 docker 컨테이너의 /app/libs에 추가
  2. ENTRYPOINT [… "-Djava.library.path=/app/libs”, …] : -Djava.library.path 옵션 추가
FROM openjdk:21-jdk

# JNI 라이브러리 복사
COPY /libs /app/libs

# JVM 실행 시 -Djava.library.path 옵션 추가
ENTRYPOINT ["java", "-Xmx1g", "-jar", "-Dspring.profiles.active=dev", "-Djava.library.path=/app/libs", "/app.jar"]

위 설정으로 /app/libs 경로에 저장된 네이티브 라이브러리를 JVM이 인식할 수 있습니다.


3. Spring Boot 프로젝트에 JNI 적용

src/
├── main/
│   ├── java/
│   │   └── com.example.nativeapp/
│   │       └── NativeLibraryLoader.java
│   └── resources/
│       └── application.yml
libs/
└── libcEngine.so
@Component
public class NativeLibraryLoader {

    static {
        try {
            System.loadLibrary("cEngine"); // 네이티브 라이브러리 로드
            System.out.println("Native library loaded successfully!");
        } catch (UnsatisfiedLinkError e) {
            throw new RuntimeException("Failed to load native library: cEngine", e);
        }
    }
}

운영체제별 네이티브 라이브러리 파일은 다음과 같은 형식을 가집니다:

  • Linux: libcEngine.so
  • Windows: cEngine.dll
  • Mac: libcEngine.dylib

위 예시에서는 cEngine이라는 네이티브 라이브러리를 사용합니다.

profile
조제

0개의 댓글