4

背景
私のアプリケーションは現在、すべてのデータが通過しなければならない AES 暗号化および復号化ストリームが最も遅い部分であるボトルネックに達しています。これを克服するために、JNI と OpenSSL を介してこの暗号化をネイティブ コードに実装し、AES-NI や直接メモリ アクセスなどを利用できるようにする予定です (私のバッファは既に直接アクセスされているため、それらへのポインタを既に取得できます)。メモリ領域)

問題
データを暗号化または解読する必要があるたびに、キーを使用して OpenSSL 暗号を再作成するのは意味がありません。Java を使用している場合は、単純に Cipher インスタンスをクラスのフィールドとして格納しますが、暗号は C の「オブジェクト」であるため、これを行うことはできません。

質問
C の「オブジェクト」を Java クラスのインスタンスに結び付けて、その後の呼び出しで格納された「オブジェクト」を使用できるようにする方法。これは、「オブジェクト」ポインターを long として Java クラスに格納し、それを逆参照することに関係していると思いますが、これが完全にクロスプラットフォームであるかどうかはよくわかりません。

答え
は次のとおりです。

  • 単純化
  • 速い
  • クロスプラットフォーム

御時間ありがとうございます!

4

2 に答える 2

1

大量のデータを渡すので、直接 ByteBuffer を使用することをお勧めします。これは、Java からネイティブ メモリへのウィンドウです。つまり、ByteBuffer に書き込むと、既にネイティブ メモリにコピーされています。C からアドレスを取得し、移動しないメモリへのポインタとして使用できます。

クロス OS が必要なだけで、OpenJDK ベースの JVM を使用している場合は、Unsafe を使用して、(ポインタのように) アドレスでネイティブ メモリに直接アクセスできます。これをクラスにまとめて、徹底的にテストすることをお勧めします。

于 2013-08-22T09:08:46.197 に答える
1

Java Object で変数を作成し、private int mNativeObjネイティブ ポインタを保存するメソッドを作成できますpublic void setNativeObject(int pointer)。C コードでは、CallVoidMethod()Java オブジェクトへのポインターを保存するために呼び出します。Oracle のドキュメントを参照できます。

于 2013-08-22T09:43:26.460 に答える