JNI(Java Native Interface)는 Java 코드에서 네이티브 코드(C, C++)를 호출할 수 있도록 지원하는 기술입니다.
Java에서 네이티브 라이브러리를 로드하기 위해 System.loadLibrary("라이브러리명")
메서드를 사용합니다.
OS별로 사용가능한 파일이 다릅니다.
.dll
.so
.dylib
Java 애플리케이션에서 JNI 라이브러리를 로드하려면 라이브러리 경로를 JVM에 알려줘야 합니다. 이는 java.library.path
시스템 속성을 설정하여 가능합니다.
java -jar -Dspring.profiles.active=dev -Djava.library.path=/home/app/jniLibs app.jar
Docker 컨테이너에 JNI 라이브러리를 포함하려면 libs
폴더를 생성하고 라이브러리를 추가한 뒤, Dockerfile을 수정합니다.
COPY /libs /app/libs
: 프로젝트의 libs 폴더를 docker 컨테이너의 /app/libs에 추가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이 인식할 수 있습니다.
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);
}
}
}
운영체제별 네이티브 라이브러리 파일은 다음과 같은 형식을 가집니다:
libcEngine.so
cEngine.dll
libcEngine.dylib
위 예시에서는 cEngine
이라는 네이티브 라이브러리를 사용합니다.