4

私はlibusbを使用しています--http ://sourceforge.net/apps/trac/libusb-win32/wiki

ただし、次のようになります。

スレッド「メイン」の例外java.lang.UnsatisfiedLinkError:USBManager.usb_init()V

public class USBManager 
{   
    static{
        System.loadLibrary("libusb");   
    }

    native void usb_init();
    public USBManager()
    {       
        usb_init();     
    } 
}
4

5 に答える 5

3

このライブラリのJava ラッパーは既に作成されています。やってみませんか?

于 2011-01-30T15:24:44.393 に答える
2

public native usb_init(); だけを使用することはできません。そのようなネイティブ ライブラリをロードすると、JNI はそのように実装されません。

javah を使用して、クラス内の特定のネイティブ関数を実装するライブラリを作成するために使用できる .h ファイルを作成します。

javac USBManager

javah で使用するクラス ファイルを作成します。

javah USBManager

これにより、関連するネイティブ関数を実装する .so/.dll に実装する関数を指定する「USBManager.h」という名前のファイルがその場所に作成されます。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class USBManager */

#ifndef _Included_USBManager
#define _Included_USBManager
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     USBManager
 * Method:    usb_init
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_USBManager_usb_1init
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

そのため、指定されたパラメーターを受け取る「Java_USBManager_usb_1init」という関数をエクスポートする必要があります。

その機能は、以下のものに過ぎません。

JNIEXPORT void JNICALL Java_USBManager_usb_1init (JNIEnv *, jobject) {
    usb_init();
}

Sun の開発者によるブログに非常に簡単な例がありますが、他にもたくさんの例があります。

于 2011-01-30T09:30:48.797 に答える
0

usb.dll が見つからないか、System.loadLibrary() の代わりに絶対パスで System.load() を試して、これを確認してください。

もう 1 つの問題は、libusb が他の DLL に依存していることです。Dependency Walkerを使用して、どの DLL が libusb によって参照されているかを確認します。

別の問題として、DLL が正しい署名で関数をエクスポートしないことが考えられます。DLL には USBManager_usb_init() 関数が必要です。javah正しい署名を作成するために使用します。

于 2011-01-30T09:03:42.100 に答える
0

JNI はかなり最小限のものであり、jni によってアクセスされる関数には、クラスに対して記述されたネイティブ ラッパー関数が必要です。ツール javah は、必要なラッパーを含むヘッダーを生成します。

ネイティブ関数に簡単にアクセスするには、JNAを使用します。

于 2011-01-30T18:58:25.183 に答える
0

試す System.loadLibrary("usb");

于 2011-01-30T07:40:26.347 に答える