Windowsで作成したDLLをJavaで動かす2
関数を1つしか定義していなかったので
複数定義した場合のパターンをやってみる
SampleDll.cpp
// SampleDll.cpp : DLL アプリケーション用にエクスポートされる関数を定義します。 // #include "stdafx.h" #include "stdio.h" int GetHello(int data) { printf("%d", data); return 0; } int GetHelloString(char *data) { printf("%s", data); return 0; } int GetHelloAdd(int data1, int data2) { return data1 + data2; }
SampleDll.def
LIBRARY SampleDll EXPORTS GetHello @1 GetHelloString @2 GetHelloAdd @3
※この@1とかって引数のやつと思ったけど違うようです。
DEF ファイルを使った DLL からのエクスポート
エクスポート関数を確認
Dump of file SampleDll.dll File Type: DLL Section contains the following exports for SampleDll.dll 00000000 characteristics 5857D09C time date stamp Mon Dec 19 21:20:44 2016 0.00 version 1 ordinal base 3 number of functions 3 number of names ordinal hint RVA name 1 0 0001102D GetHello = @ILT+40(?GetHello@@YAHH@Z) 3 1 00011190 GetHelloAdd = @ILT+395(?GetHelloAdd@@YAHHH@Z) 2 2 0001121C GetHelloString = @ILT+535(?GetHelloString@@YAHPEAD@Z) Summary 1000 .00cfg 1000 .data 1000 .gfids 1000 .idata 3000 .pdata 3000 .rdata 1000 .reloc 1000 .rsrc 8000 .text 10000 .textbss
Javaで実装
Sample01.java
package sample01; import com.sun.jna.Library; import com.sun.jna.Native; interface HelloLib extends Library { HelloLib INSTANCE = (HelloLib) Native.loadLibrary("SampleDll.dll", HelloLib.class); // Cの関数名と一致させる int GetHello(int s); int GetHelloString(String s); int GetHelloAdd(int s1, int s2); } public class Sample01 { public static void main(String[] args) { HelloLib hello = HelloLib.INSTANCE; hello.GetHello(100); hello.GetHelloString("hoge"); System.out.println(hello.GetHelloAdd(600, 1200)); } }
↓
1800 100hoge
※system.out.printlnのほうが先に出力していますね、なんで?
わかったこと
・char *で定義したら Stringで一致する。
・byte[]のやつは一部文字化けらしき問題を起こすらしい
・結果の出力は前後する場合がある