Kotlin & Java

[JNA] Kotlin C++ Module 참조하여 사용하기

y0ngha 2021. 10. 27. 19:31

JNA는 Java Native Access의 줄임말로, JNI(Java Native Interface)의 상위호환 버전이라고 생각하고 있다.

나는 Project를 진행하다가 JNA를 사용하게 될 일이 굉장히 많았는데, 타 업체에서 제공하는 모듈이 C++로 되어 있는 DLL 파일이라 이 안에 있는 함수를 사용해야 할 때 굉장히 많이 사용했다.

 

JNA는 JNI보다 사용하기 간편하고, 유지보수가 쉽다고 생각이 된다.

 

JNI를 작성할라면, C++ 언어에 대한 이해가 필요하고 Header 파일을 작성하고 gmake를 통해 Build를 진행해야 하는데,

이에 반해 JNA는 그냥 Resources 폴더에 DLL 파일을 넣어놓고 그대로 불러와서 사용하면 되니 말이다.

 

JNA를 사용하는 방법은 되게 간단하다.

 

Kotlin Project를 생성하게 되면, src 폴더와 resources 폴더가 같이 생성이 되는데, resources 폴더에 새로운 폴더 2개를 만들어주면 된다.

(32bit, 64bit를 위해서 2개를 생성하는 것이다.)

폴더명은 각각 아래와 같이 생성하면 된다.

win32-x86
win32-x86-64

끝에가 64가 붙은 폴더가 64bit를 위한 폴더다.

(이 때 64bit란 운영체제를 뜻하는 것이 아닌 JDK의 bit를 말하는 것이다.)

 

여기에 자신이 사용할 DLL을 넣어 주면 된다.

 

이제 build.gradle.kts에 JNA Library를 가져오는 코드를 넣어야 한다.

(Interface 구현을 위해서.)

 

"net.java.dev.jna:jna"를 이용하면 된다.

(버전 보러가기 : Maven Repository-JNA)

 

위 Library를 Implementation 했으면 이제 Interface를 구현하면 된다.

1
2
3
4
5
import com.sun.jna.Library
 
interface JNALibrary : Library {
    fun Greeting()
}
cs
d

여기서 4번째 Line은 불러올 Module에 있는 함수 명과 파라미터를 그대로 작성해주면 된다.

 

이 후 Class를 구현해주면 끝이다.

1
2
3
4
5
6
7
8
9
class JNAHelper {
    private val lib: JNALibrary by lazy {
        Native.load("Resources 폴더에 넣은 DLL 이름", JNALibrary::class.java)
    }
 
    fun test() {
        lib.Greeting()
    }
}
cs

JNAHelper().test() 함수를 호출하면 Module에 있는 함수가 실행되게 된다.