반응형
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 메서드를 사용하니 제대로 참고하는 것을 확인할 수 있었다.
끝.
반응형
'공부 > 프로그래밍' 카테고리의 다른 글
[gradle] 멀티모듈에서 spring 프로젝트 -> spring 프로젝트 의존성 연결하기 (0) | 2021.10.27 |
---|---|
[gradle] intellij 에서 gradle을 이용해 runnable jar 만들기 (1) | 2021.10.22 |
[jenkins] webhook 사용 자동빌딩(배포) 시, 특정 브런치명만 실행하기(CI/CD 옵션) (0) | 2021.10.13 |
[react, webpack] 경로 요약하기(alias) (0) | 2021.10.04 |
[material-ui(mui)] datepicker 설정(date format 포함) (0) | 2021.10.01 |
댓글