2015-01-07 3 views
3

JNA를 통해 MSP430.dll (여기 참조)에 액세스합니다. 그러나이 라이브러리는 MSP430.dll과 번들 된 다른 네이티브 라이브러리에 종속됩니다. 이 종속 네이티브 라이브러리의 이름은 HIL.dll입니다. jna.library.path를 사용하면 완벽하게 작동합니다. 이제는 기본 라이브러리를 내 자신의 .jar 패키지에 묶을 것입니다. 그런 다음 JNA 프레임 워크의 jar에서로드하는 자동 네이티브 라이브러리를 사용합니다. 하지만 이로 인해 종속성이있는 원시 라이브러리에 문제가 발생합니다. 내 .jar 패키지에 MSP430.dll 및 HIL.dll을 패키지하면 다음 오류가 발생합니다. "JNA java.lang.UnsatisfiedLinkError 및 지정한 모듈을 찾을 수 없습니다." 즉, MSP430.dll의 HIL.dll에 대한 종속성을 해결할 수 없었습니다. JNA의 디버그 출력에서 ​​볼 수 있습니다. MSP430.dll 만 .jar 패키지에서 추출합니다. 이 문맥에서 오류는 이해할 수 있습니다. 다음 트레일에서는 명시 적으로 HIL.dll을로드하고 MSP430.dll의 HIL.dll 추출을 볼 수 있습니다. 하지만 JNA의 모듈 오류는 여전히 발생합니다.JNA : 네이티브 라이브러리 의존성 및 JAR 추출

추출 방법의 JNA 코드를 살펴 보았습니다. JNA가 시스템 임시 디렉토리에 네이티브 라이브러리를 추출하고 자신의 임시 디렉토리를 만듭니다. 하지만 문제는 JNA가 기본 라이브러리 인 "jna"접두사와 고유 한 생성 된 숫자 값에 대한 임시 파일을 생성합니다. 여기에 JNA의 출력 :

Found library 'HIL.dll' at C:\Users\RD3\AppData\Local\Temp\jna-80961\jna1305152974718331988.dll 

나는 MSP430.dll이 HIL.dll을 찾지 않아도된다고 생각합니다. 내가 .JAR 패키지에서 JNA를 통해 응용 프로그램

다음
System.loadLibrary(C:\\absolutepath\\HIL.dll); 

만로드 MSP430.dll에 첫 번째 통화로 다음과 HIL.dll 직접 로딩 testet 한이 문제없이 작동합니다.

System.loadLibrary(C:\\absolutepath\\lol.dll); 

그때 내가 JNA에서 다시 모듈 오류를 가져옵니다 그 후 나는 lol.dll이 전화를 사용하는 HIL.dll 이름을 바꿉니다. MSP430.dll에서 이름이 바뀐 HIL.dll을 확인할 수 없습니다.

종속성이있는 네이티브 라이브러리를 .jar 패키지에 패키지하고 JNA로로드하는 것이 가능합니다. 여기

JNA를 통해 HIL.dll의 명시 적 로딩과 JNA 디버그 출력 : 당신이 가지고있는 유일한 문제는 종속 라이브러리의 이름이라고 가정

C:\Users\RD3\Desktop>call "C:\Program Files (x86)\Java\jre1.8.0_25\bin\java.exe" 
-Djna.debug_load=true -jar C:\Data\Workspace\NetBeans\MspApiTest\target\MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar 
Looking in classpath from [email protected] for /com/sun/jna/win32-x86/jnidispatch.dll 
Found library resource at jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApiTest/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/com/sun/jna/win32-x86/jnidispatch.dll 
Looking for library 'HIL.dll' 
Adding paths from jna.library.path: null 
Trying HIL.dll 
Adding system paths: [] 
Trying HIL.dll 
Looking for lib- prefix 
Trying libHIL.dll 
Looking in classpath from [email protected] for HIL.dll 
Found library resource at jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApiTest/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/win32-x86/HIL.dll 
Found library 'HIL.dll' at C:\Users\RD3\AppData\Local\Temp\jna-80961\jna1305152974718331988.dll 
Looking for library 'MSP430.dll' 
Adding paths from jna.library.path: null 
Trying MSP430.dll 
Adding system paths: [] 
Trying MSP430.dll 
Looking for lib- prefix 
Trying libMSP430.dll 
Looking in classpath from [email protected] for MSP430.dll 
Found library resource at jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApi 
Test/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/win32-x86/MSP430.dll 
Exception in thread "main" java.lang.UnsatisfiedLinkError: Das angegebene Modul wurde nicht gefunden. 

     at com.sun.jna.Native.open(Native Method) 
     at com.sun.jna.Native.open(Native.java:1759) 
     at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260) 
     at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398) 
     at com.sun.jna.Library$Handler.<init>(Library.java:147) 
     at com.sun.jna.Native.loadLibrary(Native.java:412) 
     at com.sun.jna.Native.loadLibrary(Native.java:391) 
     at de.sitec.jmspflash.Msp430Native.<clinit>(Msp430Native.java:22) 
     at de.sitec.jmspflash.Msp430Impl.init(Msp430Impl.java:50) 
     at de.sitec.jmspflash.Msp430Impl.createMsp430Impl(Msp430Impl.java:36) 
     at de.sitec.mspapitest.App.main(App.java:34) 

C:\Users\RD3\Desktop> 

안부

답변

2

참조 Native.extractFromResourcePath(). 이를 사용하여 명시 적이지 않은 종속성을 추출하고 File.rename()을 사용하여 라이브러리의 이름을 원하는대로 지정할 수 있습니다.

+1

정확한 문제와 제안이 나를 위해 작동 했음 – Martynas

+0

유효한 것으로 표시되어야합니다. – gavioto