0

Java からテスト DLL を呼び出そうとしています。

私は使っている

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.*;

クラスは次のように宣言されます

   class TestDLL {
   public native int a();
   public native int DoBeep();
   public native int PenniesToCoins();

   static { System.loadLibrary("PenniesLib");}

  // required to work with JDK 6 and JDK 7 ????????
  // I included this because it was in a few examples with the comment above
  // but it doesn't seem to make any difference 
  public static void main(String[] args){
 }
}

フレームにテストを開始するボタンがあります

void button1_actionPerformed(ActionEvent e) {
 int i;
 TestDLL t = new TestDLL();
 i= t.a();
 }
}

プログラムがクラッシュする

      i= t.a();


Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError:  testmydll.TestDLL.a()I
at testmydll.TestDLL.a(Native Method)
at testmydll.TestMyDLL.button1_actionPerformed(TestMyDLL.java:85)

ライブラリが正常に読み込まれることはわかっています。その名前を「PenniesLibX」に変更すると、エラーが発生します。

Delphi プログラムからこの DLL をテストしたところ、呼び出しが機能しました。

エクスポートされた関数を DLL Export Viewer で確認しました

a   0x00411ff4  0x00011ff4  1 (0x1) PenniesLib.dll  C:\WINXP\system32  PenniesLib.dll   Exported Function   
DoBeep  0x00411fe8  0x00011fe8  2 (0x2) PenniesLib.dll  C:\WINXP\system32\PenniesLib.dll    Exported Function   
PenniesToCoins  0x00411f7c  0x00011f7c  3 (0x3) PenniesLib.dll  C:\WINXP\system32\PenniesLib.dll    Exported Function   

大変助かります

私はこれを次のように書き直しました

import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.*;


 class TestDLL {
   public native int a();
   public native int DoBeep();
   public native int PenniesToCoins();

   static { System.loadLibrary("PenniesLib");}

 }


public class TestThisDLL {

  public static void main( String args[] ) {
      System.out.println("Start of DLL test");
      TestDLL t = new TestDLL();
      int i = t.a();
      System.out.println("DLL response is " + String.valueOf(i));
  }
}

Delphi DLL コードは

{ Copyright © 2001 Delphi 6 Developer's Guide Xavier Pacheco
   and Steve Teixeira }

{ DoBeep and a added  for testing}

library PenniesLib;
{$DEFINE PENNIESLIB}
uses
  SysUtils,
  Classes,
  PenniesInt;

function PenniesToCoins(TotPennies: word; CoinsRec: PCoinsRec): word; StdCall;
begin
  Result := TotPennies;  // Assign value to Result
  { Calculate the values for quarters, dimes, nickels, pennies }
  with CoinsRec^ do
  begin
    Quarters    := TotPennies div 25;
    TotPennies  := TotPennies - Quarters * 25;
    Dimes       := TotPennies div 10;
    TotPennies  := TotPennies - Dimes * 10;
    Nickels     := TotPennies div 5;
    TotPennies  := TotPennies - Nickels * 5;
    Pennies     := TotPennies;
  end;
end;

function DoBeep: word; StdCall
begin
    Beep;
    Result:=55;
end;

function a: word; StdCall
begin
    Beep;
    Result:=88;
end;

{ Export the function by name }
exports
  PenniesToCoins, DoBeep, a;
end.
4

1 に答える 1