暗号化機能を実行するために ac ライブラリを呼び出す Java アプリケーションがあります。これは、一部の Java プログラムから使用する必要がある c で実装されたカスタム ライブラリです。Java から bytearray を渡す関数を呼び出し、それを C 関数で符号なし文字ポインタとして扱うことができる SWIG タイプマップを定義する方法が必要です。ここで、c 関数はデータを入力して Java に返します。
私の現在の不幸なインターフェースファイルの抜粋は次のとおりです
%module CryptoFacade
%pointer_functions(int, intp);
%pointer_functions(unsigned char, unsigned_charp);
int enCrypt(char* clearText, int clearLen,unsigned char* retCipherText, int *retCipherLen);
私の不幸なJavaコードからの抜粋は次のとおりです。以下のコードでは、enCrypt 関数の呼び出しによってバッファが提供されると予想していましたが、生成されたコードに従って「ショート」が提供されます。(コード内のコメントを参照)
class MainLoader {
static {
System.loadLibrary("dccasecuJ"); //Load my crypto library
}
public static void main(String[] args) {
// Define the parameters to be passed by reference
SWIGTYPE_p_int retCipherLen=CryptoFacade.new_intp();
SWIGTYPE_p_unsigned_char retCipherText =
CryptoFacade.new_unsigned_charp();
CryptoFacade myFacade=new CryptoFacade();
// Call crypto library function. First two are value parameters, next two are return
myFacade.enCrypt("STRING-TO-ENCRYPT", 17, retCipherText, retCipherLen);
// The length I get back in fourth parameter is just fine
int gotLen= CryptoFacade.intp_value(retCipherLen);
//The value I get for the Ciphertext though is a "short" ... no good
// I need a byte[] in java that has the ciphertext
short gotText= CryptoFacade.unsigned_charp_value(retCipherText);
インターフェイス定義を次のように変更して、3 番目のパラメーターを jbytearray にする必要があると思います。次に、C プログラムの符号なし文字ポインターが指す内容を Java バイト配列にコピーするタイプマップを実装する必要があります。
コンテンツの長さを 256 バイトに指定する必要がある場合は、まったく問題ありません。任意の長さを処理するのは難しい場合があるからです。
誰かがそのようなタイプマップを見つけることができる場所を教えてもらえますか (私は SWIG が初めてで、タイプマップを書いた経験がありません)
%module CryptoFacade
%pointer_functions(int, intp);
%pointer_functions(unsigned char, unsigned_charp);
int enCrypt(char* clearText, int clearLen, jbyteArray retCipherText, int *retCipherLen);