1

Ed25519 の最も最適化された実装 ( http://ed25519.cr.yp.to/ ) には、C とアセンブリ コードの両方が含まれています。私のプログラムは Java で実装されているので、Ed25519 用の共有ライブラリ (.so) を生成したいのですが、失敗しました。これはおそらく、Ed25519 アセンブリ コードが -fPIC をサポートしていないためです (間違っていた場合は指摘してください)。JDK 8 は静的リンク ( Linking static library with JNI ) をサポートできるようですが、オンラインで見つけることができる例はありません。スタティック ライブラリ (.a) を生成して、単純に JNI で共有ライブラリとして読み込もうとしたのですが、明らかに Java では受け入れられません。実際には、スタティック ライブラリをリンクして Java プログラムにロードするにはどうすればよいでしょうか。

4

1 に答える 1

1

OK、これで ED25519 を Java プログラムに静的に統合しました。この解決策は、共有ライブラリを生成できない他のケースにも簡単に適用できると思います。

基本的に、C でラッパーを実装します。

  1. JNI インターフェース「JNI_CreateJavaVM」を呼び出して、JVM、たとえば my_jvm を起動します。
  2. my_jvm で、Java コードで定義された各ネイティブ メソッドを、JNI インターフェイス 'RegisterNatives' によって、静的ライブラリに実装された対応するメソッドに登録します (このステップでグルー プログラムが必要になる場合があります)。
  3. たとえば、JNI インターフェース「CallStaticVoidMethod」によって、my_jvm で Java コードを起動します。

ラッパーは、GCC によって静的ライブラリ (私の場合は ED25519.a) とリンクされています。私の Java プログラムはラッパーを介して起動されます。

次に、Java のネイティブ メソッドは、C ライブラリ内のメソッドを見つけて呼び出すことができます。

于 2015-03-21T18:18:32.703 に答える