C++ 구현된 어떠한 알고리즘을 사용하는 경우에 자바에서 C++ dll을 참조하는 인터페이스를 정의해서 동작시킬 수 있다. 이것은 다른 언어에서 돌리는 경우 최적화 방법이라 한다. C#에서도 c++ dll을 동작시키는 방법이 있었듯이 Java에서도 있었다.
JNI(Java Native Interface)를 사용하면 그것이 가능해진다. 본 포스트는 윈도우 환경, Java17로 진행하며 간단한 방법에 대해서 다룰것이다. 스프링 부트나 리눅스 환경에서 동작시키는 것은 추후에 해봐야하는 일이다. (so파일 생성, gradle , boot 설정 고려)
먼저 C++의 코드를 실행시킬 수 있는 인터페이스가 필요하다. header 파일 형태로 작성되며 그것이 만들어지면 cpp 파일에 구현부 부분을 추가로 작성해주면 된다. 이를 위해서는 자바에서 먼저 어떠한 방식으로 사용할지 정의해야 한다.
1. Java Native Interface 코드 작성
다음과 같이 작성하는데 Path 환경 변수에 Java 17 jdk 패스를 추가된 상태이다. 아래의 코드는 내가 자바에서 "C++ 코드를 쓸건데 이런 파라미터를 사용할거야~" 라고 명세한 인터페이스 코드라고 보면 된다.
2. C++ dll 생성을 위한 header 파일 생성
위의 인터페이스 코드는 C++ dll과 연동이 될수 있도록 c++ 형태의 인터페이스 헤더코드 또한 작성되어야 한다. 다르게 말하자면 "내가 c++ dll을 만드는데 이걸 자바에서 쓴다네? 그러면 어떤 형태로 자바에서 쓴대?" 라고 명세한 c++의 header이다. 위의 코드형태를 c++ header 형식으로 자동으로 뽑아낼 수 있다. javac.exe로 가능하다.
java 11버전까지는 javah.exe 라는 파일이 있었으나 java12 버전부터는 사라지고 javac의 -h 옵션으로 가능하게 된다. 해당 코드를 작성한 위치로 가서 javac -h . Main.java 이렇게 입력하면 된다.
실행결과로 com_test_jni_Main.h라는 파일이 생성된다. 잘보면 자바 패키지 경로와 클래스까지 맞춰져서 생성이 된다. (이 패키지 경로랑 클래스 못맞추면 동작 안되는 경우가 있어요.)
생성된 파일은 다음과 같다.
3. visual studio에서 dll 파일 생성
이제 이 파일을 들고 visual studio에서 작업을 한다. 빈 프로젝트 하나를 만들고 프로젝트 속성에 동적 라이브러리 설정을 한다.
다음엔 포함 디렉터리 설정에 jdk의 include 위치를 추가한다.
위에서 만든 com_test_jni_Main.h 파일을 visual studio 프로젝트 파일로 넣어주고 해당 파일을 include하여 함수 내부를 정의한다.
빌드를 해주면 dll 파일이 생성된다. 프로젝트는 반드시 64bit로 빌드해준다.
이제 아까 그 자바코드를 eclipse에서 실행시키면 결과는 다음과 같다. 이 때 주의할 점은 CppJNIProject.dll을 load 해줘야하는데 해당 폴더의 위치를 환경변수에 추가해줘도 되고 파일이 잡히는 위치에다가 놓아서 System.loadLibrary 함수가 참조할 수 있으면 된다.
참고
'잡지식' 카테고리의 다른 글
IT 직군 관련 포지션, 용어 정리 (0) | 2023.07.25 |
---|---|
코딩테스트 (0) | 2023.07.24 |