JNA 사용 시 데이터 전달 방법

데이터 타입

이곳에서 기본 타입에 대한 매핑을 볼 수 있다.

네이티브 api 를 호출할 때는 기본 타입을 이 매핑에 따라서 적절히 호출하며,

복잡한 객체는 json 등으로 serializing 하는 방법을 많이 사용하는 듯 하다.

String 타입은 쉽게 주고 받을 수 있으니 binary 데이터는 base64 등으로 인코딩하는 것도 한 가지 방법이다.

바이너리 데이터 받기

파라미터로 받은 Pointer 인스턴스를 이용하여 getByteArray() 메소드로 바로 받을 수 있다.

    public void callback(Pointer value, int valueLen) {
        byte[] buffer = value.getByteArray(0, valueLen);
    }

callback 호출에 의한 데이터 보내기

네이티브에서 callback 을 호출하여 Java 에서 pass-by-reference 에 의해 전달된 인자에 값을 전달해 주어야 하는 경우

JNA 에서는 com.sun.jna.ptr package의 타입을 사용한다.

ByReference타입을 상속하며, pointer 와 크기를 전달하는 방식으로 구현되어 있다.

정수를 전달하는 방법은 다음과 같다.

    public void getSomeValue(String id, IntByReference value) {
        int v = findValueOf(id); // 값을 계산해 옴
        value.setValue(v);
    }

바이너리 데이터 전달하기

Memory 인스턴스를 데이터 크기 만큼 확보하고

write() 메소드를 이용하여 데이터를 복사한다.

    public void getSomeBinary(String id,
                              PointerByReference recordValue,
                              IntByReference recordValueLen) {
        byte[] bytes = getByteDataOf(id); // 보낼 데이터 
        int byteLen = bytes.length;
        Pointer ptr = new Memory(byteLen);
        ptr.write(0, bytes, 0, bytes.length);
        recordValue.setValue(ptr);
    }

기타

데이터 전달을 위한 자세한 설명

http://java-native-access.github.io/jna/5.5.0/javadoc/overview-summary.html

Written on October 27, 2019