카테고리 없음

UnsatisfiedLinkError 트러블슈팅

kjw81024 2026. 8. 3. 18:00

인턴 하면서 노트북 필요하다고 그래서 친구한테 맥북을 빌려왔다......

처음 써보는 맥북이라 더 헤매는 중인듯

 

와서 프로젝트 파악을 하면서 테스트를 돌려보고 있었늗네 

./gradlew test로 실행하니까 다른 테스트 40개는 성공하는데 AiMediaTest의 두 개 테스트만 실패

java.lang.UnsatisfiedLinkError
java.lang.NoClassDefFoundError

OpenCV를 사용하는 테스트에서만 오류가 발생한다는걸 알았다. 

 

 

이 프로젝트는 AI 로 영상을 제작해서 화면에 띄우는 프로젝트인데

OpenCV 랑 FFmpeg를 사용 

os 에 맞는 native library (.dll, .so, .dylib)을 함께 사용하는 프로젝트 

-> 현재 실행중인 운영체제 (난 arm64) 랑 CPU 아키텍처에 맞는 네이티브 라이브러리가 반드시 로드되어야 함 

 

맥이 어떤 CPU 아키텍처인지 확인하는 쉬운 방법

uname -m

해봤더니 arm64 가 떴고, 참고로 Apple Silicon(M1, M2, M3)은 모두 arm64를 사용한다고 한다

 

일단 마저 gradle properties 를 확인해보니까 platfrom 이 linux-x86_64전용

나를 위한 네이티브 바이너리는 없었다......

 

즉 프로젝트는 linux-x86_64 용 OpenCV이고 내가 실행시키는 환경은 macOS arm64 라서 JVM 이 라이브러리 로딩에 실패해서 UnsatisfiedLinkError 가 뜬다 

 

더보기

위에 잇는 NoClassDefFoundError 발생 이유

 

OpenCV 관련 클래스가 로딩되는 과정에서 내부적으로 네이티브 라이브러리를 먼저 불러오는데

 

네이티브 라이브러리 로드 실패
        ↓
클래스 초기화 실패
        ↓
NoClassDefFoundError

 

순서로 돌아가서 초기화 실패 때문에 오류가 뜬 것...


해결

 

공용 설정 파일(back/gradle.properties)은 Docker와 CI 서버에서도 사용하기 때문에 수정하면 안 되고 

내 로컬에서만 Gradle 전역 설정을 넣어줬다 

# .gradle/gradle.properties 파일

javacppPlatform=macosx-arm64

 

그리고 쓸데없이 돌아가는 Gradle demon 은 죽임 

./gradlew --stop

Gradle 데몬이 백그라운드에 계속 떠 있으면서 이전 javacppPlatform 값을 캐싱하고 있어서 옛날에 저장되어있던 linux-x86-64 값을 계속 가지고 있게 되기 때문....

얘때문에 고쳐졌는데도 고쳐졌는지 몰랏다 

 

그다음 테스트 할 때는 cursor 말고 별도 터미널에서 실행시킴으로써 해결할 수 잇엇다