参考文章:http://hi.baidu.com/zuchang319/blog/item/39e7373cf432d2ca9e3d629f.html
首先对方写给我一个dll的方法。但是最开始的时候对方发送来的是一个string的字符串,对于Delphi而言。String应该是一个指针(这个是我自己猜想的)。
然后我是用一下方法进行调用。
package com.duduli.li;
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public interface JnaUseDelphiDll extends StdCallLibrary{
//加载动态链接库,把库dll文件默认放到系统C盘window目录下的system32文件夹下或者到java的bin目录
JnaUseDelphiDll instance = (JnaUseDelphiDll)Native.loadLibrary("WWServiceCom_3", JnaUseDelphiDll.class);
//对应动态链接库中的方法, 要注意的是 这里的方法必须要和链接库(dll文件)对应的方法名一致
// public int ClearRecord(String addr, int sm);
public String Test2();
}
package com.duduli.li;
public class TestJNA {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JnaUseDelphiDll jnaDemo = JnaUseDelphiDll.instance;
String s = jnaDemo.Test2();
System.out.println("输出结果为:"+s);
}
}
如果有参数的话,需要参考链接信息。
一下代码是从链接从复制过来。
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
public class DLL {
public static void main(String[] args) throws NativeException, IllegalAccessException{
String sb = new String("192.168.17.200");
ClearRecord(sb, 0);
}
public static int ClearRecord(long thandle, String addr, int sm) throws NativeException, IllegalAccessException{
JNative n = null;
n = new JNative("SYC","ClearRecord"); //加载动态库,SYC 为库名,ClearRecord为调用方法
n.setRetVal(Type.INT); //设置方法返回值类型
n.setParameter(0, Type.STRING ,addr); //设置第一个参数值
n.setParameter(1, sm); //设置第二个参数值
n.invoke(); //执行
int result = n.getRetValAsInt(); //获得返回值
System.out.println("返回结果: " + result);
System.out.println("调用的DLL文件名为:"+n.getDLLName());
System.out.println("调用的方法名为:"+n.getFunctionName());
return result;
}
}
经过测试,对方返回了几个类型:PAnsiChar,String,Pchar.
来进行测试。
对于第一种PAnsiChar是能正确返回数据的。
对于String的方法,会出现乱码,原因和我或许和我猜想的一样。
对于Pchar的类型。 只能获取到第一个字符。
以上只是作为总结和猜想。另外jna.jar提供大家下载。
分享到:
相关推荐
本实例将深入探讨如何使用JNA调用DLL,并涵盖了各种参数类型,包括基本数据类型、指针、结构体、回调函数、字符串以及数组。 首先,理解JNA的基本工作原理至关重要。JNA通过映射DLL中的函数到Java类的方法来实现...
研究java调用dll的时候,大部分都是通过jni,比较麻烦,我找到了通过jna方法调用dll的方法,用起来比较方便,只需要引用jna.jar包,这个jar包已经包含在程序中,还包含了我调用dll的遇到难道的解决办法。
采用java jna4.1 调用C编写的dll文件,获得返回结果,且获得返回参数的例子
2. **使用JNA调用Delphi开发的DLL**: - JNA是另一种调用本地代码的解决方案,相比JNI更简单,不需要额外的C层封装。 - 在Delphi中,创建DLL时,只需编写标准的Delphi函数,如`Hello`,并导出它。 - 在Java端,...
在实际使用JNA调用DLL前,需要定义一个接口来映射DLL中的函数。这个接口应该继承自JNA的`com.sun.jna.Library`接口。例如: ```java import com.sun.jna.Library; import com.sun.jna.Native; public interface ...
- 最后,在Java应用程序中,我们可以直接调用`addNumbers`方法,就像调用任何其他Java方法一样。Java会自动处理底层的JNI调用: ```java public class Main { public static void main(String[] args) { Delphi...
在Java编程中,有时我们需要调用第三方的DLL(动态链接库)来实现特定的功能,这在集成外部系统或使用特定硬件设备时尤为常见。本文将详细介绍如何在Java中调用第三方DLL,以及在不同操作系统上的部署策略。 首先,...
使用JNA调用Delphi DLL的步骤如下: - 创建Delphi DLL工程,但这次不需要`jni.pas`。编写一个简单的函数,如`Hello`。 - 导出`Hello`函数。 - 在Java端,引入JNA库,定义一个接口`CLibrary`,继承自`Library`,并...
总之,Java通过JNA调用Delphi编写的DLL涉及了Java接口的定义、参数类型转换以及内存管理等多个方面。在实践中,务必确保正确地处理这些细节,以确保跨语言通信的正确性和效率。同时,学习和理解DLL的内部工作原理,...
在Java中调用Delphi开发的DLL动态库主要可以通过两种方法:JNI(Java Native Interface)和JNA(Java Native Access)。这两种技术允许Java代码与本地代码进行交互,特别是对于需要调用非Java语言(如Delphi)编写的...
然后,我们需要在Delphi中实现这个函数的具体逻辑,并通过JNI接口调用Java方法。例如,我们可以使用`FindClass`、`GetMethodID`等JNI函数获取Java类和方法的引用,再使用`CallVoidMethod`等函数执行Java方法。 ...
对于JAVA,原生的API并不直接支持DLL调用,但可以通过第三方库如JNA(Java Native Access)或JAWIN来实现。JAWIN库是本文中提到的JAVA调用DLL的方法,它提供了一种桥接,使得JAVA程序能够像操作JAVA类一样调用DLL中...
基本上覆盖了目前主流的开发语言,DLL使用C++编写,演示了VB、C++、DELPHI、JAVA、C#、汇编、易语言调用这个DLL的方法。有些语言我提供了静态和动态2种调用方法。没有写的恕我孤陋寡闻,如果谁知道请联系我QQ:...
### Java调用动态链接库通用方法 #### 一、概述 在现代软件开发过程中,不同编程语言间的相互调用十分常见。例如,在Java程序中调用C语言编写的动态链接库(Dynamic Link Library,简称DLL),能够充分利用底层...
本篇文章将详细探讨如何使用四种不同的编程语言——C++、C#、Java和Delphi来调用DLL中的函数。 首先,我们来看C++的实现。在C++中,调用DLL主要通过`LoadLibrary`和`GetProcAddress`两个API函数。`LoadLibrary`用于...
项目是要求用JAVA来调用delphi提供的动态链接库,而且硬件厂商已经提供了库以及接口文档.由于以前没有接触过这样的问题,所以考虑到要跟硬件设备打交道,首先通过查相关的资料,得出在JAVA里面用JNI可以直接访问C提供的...
JNA封装意味着将虹软的C/C++原生库转换为Java可以调用的接口,这包括定义native方法,通过JNA的结构体映射来处理复杂数据类型,并实现跨语言通信。开发者在Java项目中,通过这些封装好的接口,可以轻松调用人脸识别...
对于Java开发者来说,尽管Java本身不直接支持DLL或OCX,但可以通过JNI(Java Native Interface)或JNA(Java Native Access)等技术来调用这些本地库。在实际开发中,开发者需要参照世邦提供的SDK文档,理解每个接口...