2

私たちのチームはpi4j -lib を OSGi バンドルとしてバンドルして Raspberry Pi の GPIO にアクセスしようとしていますが、UnsatisfiedLinkErrorここで何が起こっているのか、それを解決する方法がわかりません。

バンドルlibpi4j.soのフォルダーにネイティブを配置し、次のように指定しました。/libMANIFEST.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バンドルの -folder に存在するため、問題はありません。ここで何が起こっているのですか、なぜ機能しないのですか?

私の記憶が正しければ、Equinox はネイティブをロードするためにバンドル プールにアンパックしますが、アプリケーション用のものが見つかりません。それは問題ですか?

4

1 に答える 1

2

を使用しSystem.loadLibrary("pi4j")ます。libプレフィックスと.soサフィックスは、JVM によって提供されるマッピングの一部として自動的に追加されます。

たとえば、ほとんどの UNIX システムでは、上記の呼び出しがロードされますlibpi4j.so。ただし、Mac OS では になりlibpi4j.dylib、Windows では になりますpi4j.dll。開発者は、ルート名を指定するだけで、JVM が物理マッピングを実行できるようにする必要があります。

于 2013-10-24T13:57:08.900 に答える