如何在java中使用jna.jarjava jna调用dll 2017elphi写的dll

安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&之前开发的项目里需要用到一种电子设备,而电子设备的操作接口是用C语言开发,而我们的项目是用Java进行开发,所以就涉及到了Java调用C语言Dll库回调函数问题,在网上找了很多资料,但是真正好用的很少,反复测试最终把这个问题得以解决。
今天有时间就把这些整理一下,希望可以帮到以后遇到此类问题的猿猿们。
使用Java调用DLL动态链接库的方案有很多,如:JNA、JNI、Jawin、Jacob等,而此次用到的是,关于JNA的简介可以参考百度百科,这里就不再多说。
这里首先看一下C语言库的源代码,sa.h:这里定义了一个带回调函数的方法和一个普通方法
#ifndef _SA_H
#define _SA_H
#ifdef API_EXPORT
#define API_DLL _declspec(dllexport)
#define API_DLL _declspec(dllimport)
typedef void (__stdcall *CALLBACK_FUN)(int x);
extern &C& API_DLL void printfValue(CALLBACK_FUN f);
extern &C& API_DLL int Calc(int xa);
#endif sa.app源代码如下:
#include &stdafx.h&
#define API
#include &sa.h&
CALLBACK_FUN
int x = 200;
char str[] = &abcd&;
void printfValue(CALLBACK_FUN f)
int Calc(int xa)
Java源代码如下:
import com.sun.jna.N
import com.sun.jna.win32.StdCallL
public class SaDllCallbackFunctionTest {
DllLib1 cf =
public boolean init() {
cf = (DllLib1) Native.loadLibrary(&sa.dll&,DllLib1.class);
if (cf != null)
} catch (Exception e) {
e.printStackTrace();
public static void main(String[] arg0){
SaDllCallbackFunctionTest ope = new SaDllCallbackFunctionTest();
if(ope.init()){
System.out.println(ope.cf.Calc(200));;
DllLib1.CallbackFunctionImpl FUN_CMC = new DllLib1.CallbackFunctionImpl();
ope.cf.printfValue(FUN_CMC);
interface DllLib1 extends StdCallLibrary {
public int Calc(int x);
public void printfValue(CallbackFunctionImpl FUN_CMC);
public interface CallbackFunction extends StdCallCallback {
public void CALLBACK_FUN(int a);
public class CallbackFunctionImpl implements CallbackFunction {
public void CALLBACK_FUN(int a) {
System.out.println(&========& + a);
本文已收录于以下专栏:
相关文章推荐
首先说说什么叫回调函数?
在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用...
最近一个偶然的项目需要用到了java以使用java来调用vs 2005的动态库,先前只是在网上看到过了这方面的一些知识,总体上好像有三种方法,我没有各个方法都测试一下,在这里我主要讲的是JNative...
一中是用JNA方法,另外是用JNative方法,两种都是转载来的,
JNA地址:http://blog.csdn.net/shendl/article/details/3589676
一、开发环境
系统、开发环境:win7、eclipse 32位、jdk 32位、jre 32位
由于这里使用的dll文件是32位的,而我本身的环境是64位的,包括eclipse、jdk、jre都是...
1、C#调用c++dll时,关于回调函数参数的问题。
#ifdef __cplusplus
extern "C" {
extern int
C_Start();...
使用场景描述如下:
1、使用java程序调用C开发的DLL,传入一个已封装的socket对象
2、在C开发的DLL中根据传入的对象调用java提供的recv()、send()函数发送数据
#ifndef __MAIN_H__
#define __MAIN_H__
To use this exported function of dll,...
0.1 JNA是什么
JNA(JavaNativeAccess)框架是一个开源的Java框架,是SUN公司主导开发的,建立在
经典的JNI的基础之上的一个框架。
JNA项目地...
在项目中需要使用JAVA调用DLL函数,搞了几天终于搞通了,赶紧把理解的重要内容记录下来。
使用DLL函数查看器进行查看函数名称及各参数
本例子就拿GetMac函数进行举例,记事本...
很多的Dll都是C和C++写的,那么如果C#想要调用Dll中的函数怎么办,尤其是Dll函数其中一个参数是函数指针的,即里面有回掉函数的用C#怎么实现?
C中的回掉函数在C#中有中特殊的处理方式叫委托...
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)java(JNA)调用dll函数的问题&四
java(JNA)调用dll函数的问题
我们关注的,首先是调用函数的问题
然后是 传入参数的问题
最后是 取得返回值的问题
1.下载JNative.jar
2.把JNative.jar导入到工程,然后把JNative放入到系统的SYSTEM32下
3.把要调用的.dll文件放入到当前项目中或系统的SYSTEM32下
首先,dll定义的函数如下
rf_init(int port,long baud);
功 能:初始化串口
参 数:port:串口号,取值为0~3
baud:为通讯波特率
回:成功则返回串口标识符&0,失败返回负值,见错误代码表
icdev=rf_init(0,9600);//初始化串口1,波特率9600
如果是WIN32程序则icdev为设备句柄,见下例:
icdev=rf_init(0,115200);
if(icdev&0)
&&&&&&&&&&&&&
MessageBox(“rf_init error”);
int rf_beep(int icdev,unsigned int
功 能:蜂鸣
参 数:icdev:通讯设备标识符
unsigned int _Msec:蜂鸣时间,单位是10毫秒
返 回:成功则返回 0
st=rf_beep(icdev,10);&&&&&&&&&&&&
package com.
org.xvolks.jnative.JN
import org.xvolks.jnative.T
import org.xvolks.jnative.exceptions.NativeE
import org.xvolks.jnative.pointers.P
org.xvolks.jnative.pointers.memory.MemoryBlockF
public class TestConn {
&private static final int TestConnect(int port,
long baud)throws NativeException, IllegalAccessException
&&&&&&&&&&
JNative n =
&&&&&&&&&&
{&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
n = new JNative("mwrf32.dll",
"rf_init");&& //加载函数对象
&&&&&&&&&&&&&&
n.setRetVal(Type.INT);&&&&&&&
//设置函数返回值类型
&&&&&&&&&&&&&&
0;&&&&&&&&&&
//设置参数顺序
&&&&&&&&&&&&&&
n.setParameter(i++, Type.INT,
""+port);&& //设值
&&&&&&&&&&&&&&
n.setParameter(i++, Type.INT, "" +
baud);&&&&
&&&&&&&&&&&&&&
System.out.println("调用的DLL文件名为:"+n.getDLLName());
&&&&&&&&&&&&&&
System.out.println("调用的方法名为:"+n.getFunctionName());
&&&&&&&&&&&&&&
n.invoke();&& //调用函数
&&&&&&&&&&&&&&
Integer.parseInt(n.getRetVal());&&
//函数返回值
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
n.dispose();&&&&&&&&
&&&&&&&&&&
&public Pointer creatPointer() throws
NativeException{
&& pointer = new
Pointer(MemoryBlockFactory.createMemoryBlock(36));//分配的内存大小
&private& String testBeep(int
icdev,int msec)throws NativeException, IllegalAccessException
JNative n =
{&&&&&&&&&&&&&&
&&&&&&&&&&&
n = new JNative("mwrf32.dll",
"rf_beep");&& //加载函数对象
&&&&&&&&&&&
n.setRetVal(Type.INT);&&&&&&&
//设置函数返回值类型
&&&&&&&&&&&
0;&&&&&&&&&&
//设置参数顺序
&&&&&&&&&&&
n.setParameter(i++, icdev);
&&&&&&&&&&&
n.setParameter(i++, msec);&&
&&&&&&&&&&&
System.out.println("调用的DLL文件名为:"+n.getDLLName());
&&&&&&&&&&&
System.out.println("调用的方法名为:"+n.getFunctionName());
&&&&&&&&&&&
n.invoke();&&&&&&
//调用函数
&&&&&&&&&&&
n.getRetVal();&&&
//函数返回值
&&& } finally
&&&&&&&&&&&
&&&&&&&&&&&&&&&
n.dispose();&&&&&&&&
& public static void main(String[] args)throws
Exception {
&& TestConn tc = new
TestConn();
&& Pointer po =
tc.creatPointer();
&& int icdev =
TestConn.TestConnect(0, 115200);
//&& tc.testStatus(icdev,
&& tc.testBeep(icdev, 50);
System.out.println(po.getAsString());&
//把接收的值转换
又一个例子
java利用JNative调用dll文件中的方法(转)
java利用JNative调用dll文件中的方法
这几天因为项目需要,用到了java调用dll文件中的方法。写成dll文件大多是用C、VB、Delphi语言弄成的,对于我这个纯粹干java的人员来说,着实让我太为难了。唉,也就是说我编程底子没有搭好,惭愧。要是这些语言我都会些,也不至少让我了解并应用这个技术花了很长时间。
我是用JNative技术做的一个例子。需要用到的是:JNative.jar,JNative.dll这些是在Windows中开发的,如果用Linus要用到libJNative.so
1.将JNative.dl,所要读的dll文件l放在C:\windows\system32下面。
2.将JNative.jar放在你的项目下的lib下面
3.将要读的dll文件放在跟使用的类相同的目录下。
4.我的类的源码
org.xvolks.jnative.JN
import org.xvolks.jnative.exceptions.NativeE
org.xvolks.jnative.misc.basicStructures.AbstractBasicD
import org.xvolks.jnative.pointers.P
org.xvolks.jnative.pointers.memory.MemoryBlockF
public class SystemTime extends
AbstractBasicData&SystemTime&{
public short wY
&&& public short
&&& public short
&&& public short
&&& public short
&&& public short
&&& public short
&&& public short
&&& public
Pointer createPointer() throws NativeException {
pointer = new
Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));
&&& public int
getSizeOf(){
return 8 * 2;
&&& public
SystemTime getValueFromPointer() throws NativeException {
wYear = getNextShort();
wMonth = getNextShort();
wDayOfWeek = getNextShort();
wDay = getNextShort();
wHour = getNextShort();
wMinute = getNextShort();
wSecond = getNextShort();
wMilliseconds = getNextShort();
public SystemTime() throws NativeException{
super(null);
createPointer();
public String toString(){
return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":" +
wMinute + ":" + wSecond + ":" + wM
public static SystemTime GetSystemTime() throws NativeException,
IllegalAccessException {
// 创建对象
JNative nGetSystemTime = new JNative("Kernel32.dll",
"GetSystemTime");
SystemTime systemTime = new SystemTime();
// 设置参数
nGetSystemTime.setParameter(0, systemTime.getPointer());
nGetSystemTime.invoke();
// 解析结构指针内容
return systemTime.getValueFromPointer();
public static void main(String[] args) throws NativeException,
IllegalAccessException{
System.err.println(GetSystemTime());
注:Kernel32.dll是我要读的dll文件,GetSystemTime是dll文件中的方法(就是所谓的函数名)
ok,相信我这么不懂dll的都能做出来,你也能
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。&&&&&&&&最近由于工作需要,在和其它系统交互的问题上不仅仅是WebService的交互,还需要利用Java调用其它语言编写的动态链接库,例如编译好的dll文件.好,简单看一下这个问题的来源。&&&&&&&&& 我们的系统和其它系统进行交互的时候,需要网络这个阶段,这段期间数据很容易被截获,这就需要对一些敏感的数据进行加密。通常单个系统我们会用MD5进行加密,无法逆向破解,相对来说还是比较安全的,已经足够使用了。但是为了网络中传输的数据也是密文,这就需要再次进行加密了,所谓的私钥,公钥。经典的例如:DES,加强版3DES等。好先看一下简单流程:&&&&&&&&&&&这种情况下,A系统是建立在B系统的基础之上的,随意加密算法我们需要和B用一套,一般情况下,用B系统语言写的(当然A也可以),A是利用Java进行开发的,B是利用delphi,C,C++等编写的,所以我们就需要利用Java来调用其他语言编译好的Dll等文件,就像我们Java的.class文件一样。好这里看一种比较方便简单使用的JNA。&&&&&&&& JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。&&&&& &&&&&&&&优点:JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且调用本地方法还不用额外的其他处理或者配置什么的,也不需要多余的引用或者编码,使用很方便。&&&&&&&&简单看一下流程操作,首先下载jna.jar,并引入到项目中,然后看一下下边的代码&package com.ljh.
import com.sun.jna.N
import com.sun.jna.win32.StdCallL
* 测试jna调用本地接口
* @author ljh
public class testJna {
//上层接口
//需要继承stdCallLibrary,一种协议,当然也可以直接继承Library上层接口,看对方的DLL文件的编写遵从哪一种协议, 这个是jna标准
//必须定义一个接口,将Dll文件的方法提取出来,注意类型的对应
public interface EncrypStrTest extends StdCallLibrary {
//加载动态链接库,把库dll文件默认放到系统C盘window目录下的system32文件夹下或者到java的bin目录
EncrypStrTest instance = (EncrypStrTest)Native.loadLibrary(&Dll文件的名字&, EncrypStrTest.class);
//定义接口,
public String EncrypString(String aSrc, String aKey);//定义接口
public static void main(String[] args) {
EncrypStrTest jnaDemo=EncrypStrTest.
String resultString=jnaDemo.EncrypString(&参数一&,&参数二&);
System.out.println(&会有结果么:& + resultString);
}catch(Exception e){
e.printStackTrace();
}&&&&&&&&&这样我们就可以调用其它语言的dll控件了,而windows本身提供了很多dll控件我们就可以通过JNA进行本地方法的调用了,这样大大扩展了Java程序的面。非常方便的,当然了还有其他方法,不断学习中……&
本文已收录于以下专栏:
相关文章推荐
0.1 JNA是什么
JNA(JavaNativeAccess)框架是一个开源的Java框架,是SUN公司主导开发的,建立在
经典的JNI的基础之上的一个框架。
JNA项目地...
[java] view
public class LoadDll{
public interface Dll extends StdCallLibr...
JNA调用dll\so的路径问题和测试样例
本文主要几点内容如下:
1.jda具体的放置路径
3.测试代码
此文就是便于自己以后回顾使用,所以就不罗嗦...
最近一个 Java 项目需要调用公司的读卡器读取卡号。C 开发提供了一个读取卡号的 DLL。
Java 调用 DLL 无非三种方法:JNI、JNA、JNative
本来 C 开...
如何使用java调用dll?
一般是用jni直接来调用dll的接口.因为中文乱码,GBK,utf-8等一系列原因,我选择了用jna这个第三方接口来.
Dll放的位置:可以放在项目的根目录下,可以放在j...
JNA—JNI终结者
给大家介绍一个最新的访问本机代码的Java框架—JNA。
JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开...
以前从效率上考虑,做native调用都是通过jni实现,其中的一些障碍我想开发过jni的人都知道,比如你要复用老的代码库,为了适应Jni的机制需要再做一次封装,这其中要涉及到jni的内存管理规则,和J...
一中是用JNA方法,另外是用JNative方法,两种都是转载来的,
JNA地址:http://blog.csdn.net/shendl/article/details/3589676
部署Tomcat时使用jni和jna调用DLL文件的问题
我的前一篇博客提到,我们公司项目的restful框架中要用到底层的DLL
C++库,最后经过测试验证结果选择采用JNA方法来调DLL库。之...
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)JAVA调用DELPHI开发的DLL小结_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
JAVA调用DELPHI开发的DLL小结
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 java jna调用dll 的文章

 

随机推荐