2

これをstackoverflowとインターネットで検索しましたが、まだ答えが見つかりません。

ソースコードを入手していない指紋リーダーのSDKがあります。つまり、変更できません。

アクセスする必要があるいくつかのメソッドがあり、そのインターフェイスを以下にリストします (RS_API.h から)。

REALSCANSDK_API int __stdcall RS_InitSDK( const char* configFileName, int option, int* numOfDevice );
REALSCANSDK_API int __stdcall RS_InitDevice( int deviceIndex, int*deviceHandle );
REALSCANSDK_API int __stdcall RS_SetCaptureMode( int deviceHandle, int captureMode, int captureOption, bool withModeLED );
REALSCANSDK_API int __stdcall RS_SetViewWindow( int deviceHandle, HWND windowHandle, RECT drawRectangle, bool autoContrast );
REALSCANSDK_API int __stdcall RS_TakeImageDataEx( int deviceHandle, int timeout, int fingerIndex, bool withLED, unsigned char** imageData, int* imageWidth, int* imageHeight );

それらすべてを Delphi に変換することはできましたが、Java アプリからもアクセスしたいと考えていました。

私のプロトタイプは次のようなものです:

public class Leitor {
    public native int  RS_InitSDK(String configFileName, int option, int numOfDevice );

    public static void main(String[] args) {
        Leitor leitor= new Leitor();
        leitor.RS_InitSDK(null, 0, 0);
    }
  static 
  {
    System.load("C:\\temp\\SDKSuprema\\SDK\\RS_SDK.dll");    
  }
}

ロード ビットは正常に動作します (dll ファイルを見つけることができることを意味すると思います) が、ネイティブ メソッドを実行すると例外がスローされます。

スレッド「メイン」での例外 java.lang.UnsatisfiedLinkError: leitor.Leitor.RS_InitSDK(Ljava/lang/String;II)I at leitor.Leitor.RS_InitSK(Native Method) at leitor.Leitor.main(Leitor.java:14)

dllの名前を変更すると、エラーが「ライブラリを読み込めません」に変わるため、メソッドのマッピングに問題があると思います。

また、Java から呼び出される参照パラメーターによるパスをマップする方法も見つかりませんでした。唯一の解決策は、単一の結果ではなく構造を返すように dll を変更することでしたが、コードを変更できないため、これは不可能です。

2 つ目の問題は、ウィンドウ ハンドルを swt から JNI ネイティブ メソッドに送信することです...

どんな助けでも大歓迎です!

4

2 に答える 2

2

パラメーターを Java オブジェクトとして受け取り、それらを既存の C エントリー・ポイントが期待する表現に変換する明示的なグルー・コードを作成する必要があります。JVM はそれ自体でこれを行いません。

このグルー コードの記述方法については、 JNI 仕様を参照してください。

特に、Java 宣言と一致させるには、JNI エントリ ポイントの名前をpackage_name_here_Leitor_RS_1InitSDKorにする必要がありますpackage_name_here_Leitor_RS_1InitSDK__Ljava_lang_String_2II。仕様の第 2 章の「ネイティブ メソッド名の解決」セクションを参照してください。この関数は、Java の可視の引数の前にいくつかの追加の引数を取る必要があります。仕様の「ネイティブ メソッド引数」を参照してください。

このメソッドでは、文字列がjstring値として渡されます。これGetStringUTFCharsは、JVM のヘルパー関数を使用して C 文字列に変換する必要があります。

参照渡しパラメーターの場合、JNI コードによってフィールドが割り当てられたオブジェクトを渡す、または (迅速かつ汚い方法で) オブジェクトを渡すなど、呼び出し元の Java コードにとって意味のあるパラメーターをシミュレートする方法を見つける必要があります。int[]最初の要素が JNI コードによって割り当てられます。

于 2012-11-09T17:25:54.323 に答える
1

Java メソッドを実装するには、c/c++ グルー コードを作成する必要があります。クラスで javah を呼び出すと、ネイティブとしてマークされた Java メソッドに対応するネイティブを宣言するヘッダーが作成されます。

C/C++ を書きたくない場合は、ほとんどの場合、 JNA を使用して Java コードを既存の C メソッドおよび構造体にマップできます。

于 2012-11-09T17:31:49.980 に答える