“线程中的异常”;AWT-EventQueue-0“;java.lang.UnsatifiedLink错误:testmydll.TestDLL.a()I
我正在尝试从Java调用测试DLL 我正在使用“线程中的异常”;AWT-EventQueue-0“;java.lang.UnsatifiedLink错误:testmydll.TestDLL.a()I,java,swing,delphi,dll,jna,Java,Swing,Delphi,Dll,Jna,我正在尝试从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; impo
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导出查看器检查了导出的函数
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.
您没有按照预期的方式包装本机库。事实上,您在问题代码中没有使用任何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字节类型非常复杂,我认为32位有符号整数最有意义。您有DLL的源代码吗?为什么main为空,以便更好地帮助您尽早发布SSCCE、short、runnable、compileable、,Swing Gui必须在上创建我已将Delphi源代码添加到postingI已将其作为非Swing程序重新编写我认为问题在于我天真地假设您可以轻松地从Java调用普通DLL。说明Java本机接口使用自己的命名约定,必须专门编写JNI DLL。有没有一种从Java调用标准DLL的简单方法?我很高兴听到这个消息,并感谢您的接受。我无法让我的Java JVM加载已编译的类,但我有理由相信这只是一个问题,因为我完全不知道如何运行Java。问题中的代码是对常见JNA示例的简单修改。