본문 바로가기
공부/프로그래밍

[java] JNA를 이용해 공유 라이브러리 파일(.so 파일) 읽기

by demonic_ 2021. 10. 15.
반응형

JNI(Java Native Interface) 와 JNA(Java Native Access) 의 차이는 인터넷에 많으니 생략.

여기서는 파일을 읽는 방법과, 그것을 사용하는 방법에 대해 다루기로 한다.

 

개발하는데 확장자 so파일을 받아 처리해야 하는경우가 생겼는데, (so파일일 경우 리눅스에서만 돌아간다. Mac 과 윈도우는 각각 다른 확장자명을 컴파일 가능) JNA를 통해 읽으려니 자꾸 파일에러가 났다. 코드가 다음과 같다.

public interface TestDll extends Library {
        int TeseVersion(Memory Ver);
}


public class Test {
    public static void main(String[] args) {
        TestDll testDll = (TestDll) Native.loadLibrary("Test", TestDll.class);
        ...
    }
}

에러메세지

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'Test':
dlopen(libTest.dylib, 9): image not found
dlopen(libTest.dylib, 9): image not found
Native library (darwin/libTest.dylib) not found in resource path (.../jna-5.3.1.jar)
...

 

내용을 보면 libTest.dylib를 참조하지 못해서 발생한 에러라고 뜬다.

(.dylib 는 mac 에서 사용할때 찾는 확장자다.)

 

때문에 절대경로를 넣어주는게 좋은데 그럼에도 동일한 문제가 발생했다. 이유는 loadLibrary 함수를 써서 그런 것. 첫번째 파라미터를 파일이 있는 절대경로로 잡고 load 메서드를 쓴다면 읽을 수 있다. (다만 테스트를 리눅스에 직접 올려서 해야만 했다)

 

그래서 해당코드를 다음과 같이 수정한다.

...
//        TestDll testDll = (TestDll) Native.load("Test", TestDll.class);
        String filename = "/home/ec2-user/test/test.so";
        TestDll testDll = (TestDll) Native.load(filename, TestDll.class);
...

 

절대경로를 넣어준 후, load 메서드를 사용하니 제대로 참고하는 것을 확인할 수 있었다.

 

 

 

끝.

 

반응형

댓글