on
[java] JNA를 이용해 공유 라이브러리 파일(.so 파일) 읽기
[java] JNA를 이용해 공유 라이브러리 파일(.so 파일) 읽기
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 메서드를 사용하니 제대로 참고하는 것을 확인할 수 있었다.
끝.
from http://lemontia.tistory.com/1055 by ccl(A) rewrite - 2021-10-15 09:27:56