[Java] JNI로 외부 dll 참조하기
JNI(Java Native Interface)를 사용하면 C/C++로 짜인 동적 라이브러리를 사용해서 성능을 최적화할 수 있다.
테스트 환경은 윈도우다.
자바는 Java 12, 비주얼스튜디오 2019
먼저 사용할 dll을 만들어보겠다.
좀 불편한 편이다...
자바에 맞는 헤더파일을 만들어야 하는데, 그에 앞서 먼저 자바에서 프로토타입을 선언해줘야 한다.
native 키워드를 붙이고 구현을 하지 않는다.

이제 헤더파일을 만들려면, 자바의 javah라는걸 사용해야 한다.
javah의 명령행 인자로는 dll을 사용할, 패키지와 클래스명을 넣어줘야 한다.
난 여기서 사용할 거라서
이렇게 썼다.
유의할 점이 몇가지 있는데, 소스가 있는 루트 디렉터리에서 사용해야 한다는 것이 하나요.
javah가 jdk12부터는 없으므로 java11 이하의 javah를 써야한다는 것이 둘이요.
저렇게 돌린다면 이렇게 헤더파일이 생성될 것이오
안을 보면 프로토타입도 끔찍할정도로 조잡하게 잘 선언되어있을 것이고
저걸 그대로 잘 간직해놓자.
일단 비주얼 스튜디오로 C/C++ 프로젝트를 생성하겠다.

이름은 boom

가장 먼저 사용하는 자바와 버전을 맞춰준다.
사용하는 자바가 Program Files에 있다면 64비트로,
Program Files (x86)에 있다면 32비트(86)으로

그다음엔 프로젝트 속성에 들어가서 .exe로 되어있을 것을 .dll로 바꾼다.
라이브러리로 빌드하기 위함이다.
그리고 포함 디렉터리 추가 창을 열어서

현재 사용중인 자바 버전의 include, include/win32 폴더를 포함한다.

그러고 나면... 함수를 구현할 소스파일을 만들고,
아까 javah로 만든 헤더파일을 가져온다.

그리고 저 헤더에 있는 프로토타입들을 복붙해서 구현한다.

빌드한다.

빌드된 dll 파일을 찾는다.

그걸 Java 프로그램이 실행될 루트 디렉토리에 놓고

loadLibrary로 저 dll 이름을 잘 지정해주고,
사용하면
잘 돌아간다.
JNI를 쓰는 게 이렇게 장황하고 불편하다.
성능이 정말 크리티컬한 부분이 아니면 쓰지 말자.
참조
https://mommoo.tistory.com/71
https://github.com/s-u/rJava/issues/176