2013-10-24 2 views
2

Наша команда пытается связать pi4j -lib в качестве пакета OSGi для доступа к GPIO на малиновом Pi, но мы получаем UnsatisfiedLinkError и не знаем, что здесь происходит и как его решить ,UnsatisfiedLinkError при загрузке собственной библиотеки linux в OSGi

Ставит родную libpi4j.so в папке /lib пучка, и уточнил MANIFEST.MF так:

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: Pi4j 
Bundle-SymbolicName: com.pi4j 
Bundle-Version: 1.0.0.SNAPSHOT 
Bundle-Vendor: http://pi4j.com/ 
Bundle-RequiredExecutionEnvironment: JavaSE-1.7 
Bundle-NativeCode: lib/libpi4j.so; osname=linux;processor=arm 
Eclipse-PlatformFilter: (& (osgi.os=linux) (osgi.arch=arm)) 
Bundle-ClassPath: lib/, . 
Export-Package: com.pi4j.concurrent,[.. some more packages] 

Это ошибка-сообщение:

!SESSION 2013-02-10 08:21:25.975 ----------------------------------------------- 
eclipse.buildId=unknown 
java.version=1.7.0_40 
java.vendor=Oracle Corporation 
BootLoader constants: OS=linux, ARCH=arm, WS=gtk, NL=de_DE 

!ENTRY org.eclipse.osgi 4 0 2013-02-10 08:21:37.256 
!MESSAGE Application error 
!STACK 1 
java.lang.UnsatisfiedLinkError: no libpi4j in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1878) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:849) 
    at java.lang.System.loadLibrary(System.java:1087) 
    at com.pi4j.util.NativeLibraryUser.<clinit>(NativeLibraryUser.java:36) 
    at eu.gemtec.carepi.app.Application.start(Application.java:30) 
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 

Класс NativeLibraryUser имеет звоните в System.loadLibrary("libpi4j"), чтобы загрузить родной. Нативный присутствует в /lib - папке с пакетом, так что это не проблема. Что здесь происходит, почему это не работает?

Если я правильно помню, равноденствие распаковывает родной пул пучков, чтобы загрузить его, но я не могу найти его для нашего приложения, это проблема?

+1

Попробуйте вызвать только «System.loadLibrary (« pi4j »)». Префикс lib и .so добавляются автоматически. –

+0

Это решение! Если вы создадите ответ, я его приму. Можете ли вы предоставить список схемы именования, используемой для других платформ? – Chriss

ответ

2

Использование System.loadLibrary("pi4j"). Префикс lib и суффикс .so автоматически добавляются как часть отображения, предоставленного JVM.

Например, в большинстве систем UNIX вышеуказанный вызов будет загружен libpi4j.so. Однако на Mac OS это будет libpi4j.dylib, а на Windows это будет pi4j.dll. В качестве разработчика вы должны просто указать имя корня и разрешить JVM выполнять физическое сопоставление.

 Смежные вопросы

  • Нет связанных вопросов^_^