m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

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[]のやつは一部文字化けらしき問題を起こすらしい
・結果の出力は前後する場合がある

所感

C++とかほとんど知らないけどなんかJavaから呼び出せるようになるとちょっとおもしろい