久しぶりにJavaを触ってみようじゃないか。DLLを呼び出す。
Hello Worldでけたので、DLLをCALLしてみる。昔はこんなこと取り組んでなかったってのと、やっぱりJavaってちょいちょい仕様が変わるのかWebの賢者たちの記事があまり役にたたなくて苦労したぜー。
さて、JavaからNativeなDLLを呼び出すにはJNAってやつをつかうらしい。JNA=Java Native Access、、、英語圏の方々のこの省略やめてくれんかなーっていつも思う。いや、やってもいいけど、何を省略しているのかを毎回書けよって思う。初見殺しというか、一言さんお断りというか、高すぎて越えられない心の壁を感じる。そういう意味ではDLL=Dynamic Link
Library。今まで書いたことなかったかもすまソ。
JNAはこちらからダウンロードできる。まぁまぁ下の方にあるこちら。
それはおいておいて、eclipseでprojectを作っていくぞい。
やり方はHelloWorldと同じ。project名をstudy103、メインのあるclass名をrijndael_callってする(まぁたAESかいってつっこまんでー)。
さて、ダウンロードした、JNAをどっか適当なところに持ってくる。うちではeclipseのworkspaceのそこに保存した。まぁどこでもいいんよ。
で、AESのDLLはworkspace下のdllってところに入れた。まぁどこでもいいんよ。
で、projectにJNAを入れ込む。projectのpropertyを押す。
で、"Java Build Path"ってのを選んで、"Libraries"タブを選んで、”Modulepath”を選んだ状態(Classpathを選んだ状態、、、って信じ切ってたんで、ここではまった)で、"Add External JARs..."を押す。
で、保存したjnaのjarを選ぶ。
こうなる。
で、ApplyやらApply and Closeやら押す。
module-info.javaに
requires com.sun.jna;
を追加する。
こんな感じ。
で、
rijndael_call.javaにコードを追加していく。
こうなる。
Javaってunsignedってのがないらしく、0x80以上の数字は明示的にキャストせんといかんとか、ナゾのお手当てをしている。
-
package study103;
-
import com.sun.jna.Library;
-
import com.sun.jna.Native;
-
public class rijndael_call {
-
static byte[] key={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
-
static byte[] plain={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77, (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb, (byte)0xcc, (byte)0xdd, (byte)0xee, (byte)0xff};
-
public interface RijndaelLib extends Library{
-
RijndaelLib INSTANCE= (RijndaelLib)Native.load("C:/Users/<username>/Documents/work/eclipse-java/study1/dll/rijndael_64.dll",RijndaelLib.class);
-
int AES128Encrypt(byte[] plain,byte[] key,byte[] akeome);
-
}
-
public static void main(String[] args) {
-
byte[] crypted=new byte[16];
-
RijndaelLib rijndaelLib=RijndaelLib.INSTANCE;
-
rijndaelLib.AES128Encrypt(plain, key, crypted);
-
for(int i=0;i<16;i++) {
-
System.out.print(String.format("%02X",crypted[i]));
-
}
-
System.out.println("");
-
}
-
}
Javaってunsignedってのがないらしく、0x80以上の数字は明示的にキャストせんといかんとか、ナゾのお手当てをしている。
Native.loadLibraryってのがNative.loadに替わったらしい。
ってのもはまりポイント。
では実行してみる。
Project->Build Automaticallyにチェックが入っている状態で、再生ボタンを押す。
するってーと、
でけたー。
ちなみにrijndaelのソースコードはこちらに入れた。
いやーweb資料があまり役に立たなかったのでしんどかったです。プロフェッショナルなプログラマーは変更履歴から読み取るんだろうけど、webの実践記事だけを頼りにするとまぁまぁうまくいかんもんやね。そう考えると、AIなんて役に立たんやんとも思う。ちょっと前に取り組んで愕然としたので、今はAIに聞こうという気はさらさらないんやけどね。結局全部知ってないと、AIが作ったブラックボックスをどうしていいのかもわからんよね。妄想や幻想にかられて挑戦したものの挫折したときに、自力で這い上がる胆力が必要な時代や。
コメントをお書きください