gpt4 book ai didi

java - 线程中出现异常 "AWT-EventQueue-0"java.lang.UnsatisfiedLinkError : testmydll. TestDLL.a()I

转载 作者:行者123 更新时间:2023-12-01 14:24:43 29 4
gpt4 key购买 nike

我正在尝试从 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.

最佳答案

您没有按照您应该的方式包装 native 库。事实上,您在问题的代码中没有使用任何 JNA。关键是你必须调用Native.loadLibrary。

您的 Java 代码应如下所示:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;

public class TestThisDLL {
public interface PenniesLib extends StdCallLibrary {
PenniesLib INSTANCE = (PenniesLib) Native.loadLibrary(
"PenniesLib", PenniesLib.class);
int a();
}

public static void main(String[] args) {
int value = PenniesLib.INSTANCE.a();
System.out.println(value);
}
}

请注意,我冒昧地假设您将在 Delphi 代码中将 Word 更改为 Integer。由于 Java 没有无符号类型,而且 16 字节类型已经是 90 年代的了,所以我认为 32 位有符号整数最有意义。

关于java - 线程中出现异常 "AWT-EventQueue-0"java.lang.UnsatisfiedLinkError : testmydll. TestDLL.a()I,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17250189/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com