Windowsでは、Javaソケットを介してサードパーティのTCPデータが入ってきます.JNAを使用して、同じサードパーティが提供するCライブラリにデータを渡す方法を見つけようとしています。私はJNA/JNI/Cなどすべてに不慣れです。
サードパーティのライブラリは、ソケットから着信バイトを取得し、正しいメッセージ タイプにデコードします。入ってくるデータは任意の長さであり、終了区切り文字がなく、開始区切り文字が非常に短いため (データの途中に表示され、実際の区切り文字ではない可能性があります)、これを使用する方法を理解するのは実際にはおそらく簡単です。自分でロールバックする (または C を学ぶ) 代わりに、JNA を介してライブラリを使用します。
jnaerator を使用して、C ヘッダー ファイルからソース コードを生成することができました。また、パラメーターを必要としない単純な C 関数の呼び出しにも成功しました。しかし、元々 void ポインターを受け入れていた C 関数に「生データ」を渡す必要がある関数を使用しようとすると、どうすればよいかわかりません。
コードからの関連するスニペットを次に示します。
//CExportTypes.h
typedef unsigned int XUint;
//also defines structs: XMessageType, XCrypto, XAlarm, etc.
//CLibrary.h
XStatus XGetMessageType(void* bytesRecv, XUint numBytes, XMessageType* type, XUint* serial, XUint* msgLen);
XStatus XDecodeAlarm(void* bytesRecv, XUint numBytes, XCrypto* key, XAlarm* decodedAlarm);
//CLibrary.java (Generated)
int XGetMessageType(Pointer bytesRecv, int numBytes, IntBuffer type, IntBuffer serial, IntBuffer msgLen);
int XDecodeAlarm(Pointer bytesRecv, int numBytes, XCrypto key, XAlarm decodedAlarm);
受信を取得するにはどうすればよいですか
int = Socket.getInputStream()
JNA関数が期待するポインタへの「生データ」? 他に知っておくべき落とし穴はありますか? エンディアン、符号なしバイトの問題など?
大したことではないかもしれませんが、できる限りの支援をお願いします。