`

JAVA与DLL交互

    博客分类:
  • JAVA
阅读更多

jna官网地址:https://jna.dev.java.net/

首先写了一个用于测试的DLL文件:

FirstDLL.h头文件:

 

#ifdef FirstDLL_API
#else
#define 
FirstDLL_API extern "C" _declspec(dllimport)
#endif

typedef struct{
	char* userName;
	int age;
	char* tel;
}User;

FirstDLL_API int GetSum(int a,int b);
FirstDLL_API char* CallChar(char* a);
FirstDLL_API void CallPointer(int *a);
FirstDLL_API void CallPIntArray(int *a,int len);
FirstDLL_API int CallStruct(User &user);
FirstDLL_API int CallStructArray(User *user,int len);
FirstDLL_API void CallVRef(int a,int b,int &c);


 FirstDLL.cpp文件:

#define FirstDLL_API extern "C" _declspec(dllexport)
#include "FirstDLL.h"
#include <iostream.h>


int GetSum(int a,int b)
{
	return a+b;
}

char* CallChar(char* a){
	return a;
}

int CallStruct(User &user){
	user.userName = "陈均";
	user.age = 22;
	user.tel = "8888888";
	return 0;
}

int CallStructArray(User *user,int len){
	for(int i = 0;i<len;i++)
	{
		user->userName = "陈均";
		user->age = i+1;
		user->tel = "电话";
		user++;
	}
	return 0;
}


void CallPointer(int *a){
	*a = 5;
}

void CallPIntArray(int *a,int len){
	for(int i = 0;i<len;i++){
		*a = i+3;
		a++;
	}
}


void CallVRef(int a,int b,int &c){
	c = a + b;
}

 

编译后生成FirstDLL.dll文件.

测试文件FirstDLLTest:如果是Delphi写的DLL,将下面的生命改成如下格式即可

typedef int (FAR PASCAL *SetSrvProc)(int srv,int zh,int jh);

#include <iostream.h>
#include <WINDOWS.H>
#include <WINBASE.H>

HINSTANCE first_dll = NULL;

//声明结构体类型
typedef struct{
	char* userName;
	int age;
	char* tel;
}User;

//外部dll声明
typedef int (*GetSumProc)(int a,int b);
typedef int (*CallStructProc)(User &user);
typedef int (*CallStructArrayProc)(User *user,int len);
typedef void (*CallPointerProc)(int *a);
typedef void (*CallPIntArrayProc)(int *a,int len);
typedef void (*callVRefProc)(int a,int b,int &c);

//结构体声明
typedef struct{
	int kh;//0x0000,0x0001,0x0002,0x0003
	unsigned char mu;//0x0004
	short qty;// 0x0006,0x0007
	int je;// 0x0008,0x0009,0x000A,0x000B
	int ye;// 0x000C,0x000D,0x000E,0x000F
	unsigned short year;//0x0010,0x0011
	unsigned char month,day,hour,minute,second,ms,sd;//0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018
	unsigned char jh;//0x0019
	unsigned char lb;//0x001A
	unsigned char online;//0x001B
	//如果对齐设置默认8则:0x0000-0x001B共28个字节-->4倍  28
	//如果对齐设置1则:0x0000-0x001A共27个字符
}PKQRCDA;


void main()
{
	
	User user;
	User array[2];

	//调用外部dll的GetSum方法
	first_dll = LoadLibrary("E:\\C++WORK\\FirstDLL\\Debug\\FirstDLL.dll");
	if(first_dll!=NULL){
		GetSumProc getSum = (GetSumProc)GetProcAddress(first_dll,"GetSum");
		int result = getSum(4,5);
		cout<<result<<endl;
		CallStructProc callStruct = (CallStructProc)GetProcAddress(first_dll,"CallStruct");
		result = callStruct(user);
		cout<<user.userName<<endl;
		CallStructArrayProc callStructArray = (CallStructArrayProc)GetProcAddress(first_dll,"CallStructArray");
		result = callStructArray(array,2);
		cout<<array[0].age<<endl;
		CallPointerProc callPointer = (CallPointerProc)GetProcAddress(first_dll,"CallPointer");
		int a = 3;
		callPointer(&a);
		cout<<a<<endl;
		CallPIntArrayProc calPIntArray = (CallPIntArrayProc)GetProcAddress(first_dll,"CallPIntArray");
		int len = 3;
		int pia[20];
		calPIntArray(pia,len);
		callVRefProc calVRef = (callVRefProc)GetProcAddress(first_dll,"CallVRef");
		int c;
		calVRef(4,7,c);
		

	}


}

 

以下是java测试:

IFirstDLL接口文件:

public interface IFirstDLL extends Library {
	//绝对路径,在开发的时候可以这样写,方便更新
	IFirstDLL INSTANCE = (IFirstDLL) Native.loadLibrary("E:\\C++WORK\\FirstDLL\\Debug\\FirstDLL.dll", IFirstDLL.class);
	//相对路径,在不修改dll的时候可放到jdk/bin下面或者system32
	//IFirstDLL INSTANCE = (IFirstDLL) Native.loadLibrary("FirstDLL", IFirstDLL.class);
	//下面是dll对应的接口方法声明,参数类型和返回类型要一致
	//结构体声明
	public static class User extends Structure{
		public String userName;
		public int age;
		public String tel;
	}
	
	//值传递
	int GetSum(int a,int b);
	//字符串传递
	String CallChar(String a);
	//整形指针传递
	void CallPointer(IntByReference a);
	//整形数组传递,c指针变量
	void CallPIntArray(int []a,int len);
	//结构体值传递
	public int CallStruct(User user);
	//结构体数组传递,结构体指针变量接收
	public int CallStructArray(User[] user,int len);
	//带返回值的传递
	public void CallVRef(int a,int b,IntByReference c);
	
}

 

测试文件IFirstDLLTest:

public class IFirstDLLTest {

	public static void main(String[] args) {
		IFirstDLL firstDLL = IFirstDLL.INSTANCE;
		int a = 4;
		int b = 6;
		firstDLL.GetSum(a, b);
		firstDLL.CallChar("字符串内容");
		IntByReference d = new IntByReference();
		firstDLL.CallPointer(d);
		int[] e = new int[2];
		firstDLL.CallPIntArray(e, e.length);
		User user = new User();
		firstDLL.CallStruct(user);
		System.out.println("userName:" + user.userName+";age=" + user.age + ";tel=" + user.tel);
		User[]users = new User[3];
		firstDLL.CallStructArray(users, users.length);
		IntByReference c = new IntByReference();
		firstDLL.CallVRef(3, 5, c);
	}
}

 

搞定了,常用的交互基本上都有了。复杂的也是这些演变出来的。

附件包含上面3个工程。

分享到:
评论

相关推荐

    java与dll的交互

    Java与DLL(动态链接库)的交互是跨平台编程中的一种常见需求,特别是在需要利用C++等原生代码的功能时。DLL是Windows操作系统中的一个重要组件,它允许不同程序共享同一块内存中的函数和数据,从而提高了系统资源的...

    java与Delphi写的dll交互

    Java与DLL交互通常通过Java的JNI(Java Native Interface)来实现。JNI允许Java代码调用本地(非Java)代码,如C、C++或Delphi编写的DLL。以下是一些步骤和注意事项: 1. **创建Delphi DLL**: - 定义接口:在...

    java实例,通过jawin实现对dll中方法的调用

    jawin.jar包含了Java接口,jawin.dll则是Java与DLL交互的桥梁,它实现了Java和C/C++之间的互操作性,使得Java程序员可以方便地调用DLL中的函数。 首先,我们需要理解Java与DLL交互的基本概念。在Java中,我们通常...

    java和dll交互代码

    Java 作为跨平台的编程语言,通常不直接处理 DLL 文件,但有时为了利用特定操作系统提供的功能或调用 C/C++ 编写的库,我们需要让 Java 与 DLL 进行交互。 在 Java 中,有几种方法可以实现与 DLL 的交互: 1. **...

    java调用dll需要的jna包

    Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要依赖于Java Native Access (JNA) 库。...这两个jar包的使用,大大简化了Java与DLL交互的复杂性,使得这种跨语言的调用变得相对简单和安全。

    Java加载dll,导致Java进程内存泄露

    标题“Java加载dll,导致Java进程内存泄露”涉及到的是Java平台与本地库(DLL)交互时可能出现的问题。在Java中,通过Java Native Interface (JNI) 可以调用C/C++编写的动态链接库(DLL),实现Java代码与本地代码的...

    msjava.dll

    总的来说,msjava.dll是Windows系统与Java应用程序交互的重要组件,理解和处理与之相关的错误对于确保系统的正常运行至关重要。通过理解其作用、可能出现的问题以及解决方案,用户可以更好地维护自己的计算机系统。

    JAVA调用C++的dell应用例子

    java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows\linux系统中,实现java与native method互调)。目前只能由c/c++实现。后...

    java调用dll必备jar包

    Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要应用于Java与本地代码交互,例如在Java中利用C++或C编写的库。本文将详细介绍如何使用Java调用DLL以及所需的必备jar包。 首先,Java并不直接支持DLL的...

    java&dll;交互混合.rar

    交互混合.rar”提供了一个Java与DLL(动态链接库)交互的混合开发案例,这通常发生在需要利用C/C++的高效性能或者已有的库资源,而应用主体是Java的情况下。以下是对这个实例的详细解析: 首先,Java是一种跨平台的...

    msjava.dll下载

    随着Java版本的更新和微软与Sun Microsystems(现为Oracle)的法律争端,msjava.dll逐渐被淘汰。新版本的Java不再支持这个库,导致在现代系统上可能会出现兼容性问题,如错误提示或者程序无法正常运行。 **知识点四...

    Java调用dll实现des加密解密

    总的来说,通过Java调用DLL实现DES加密解密涉及了Java和C/C++的混合编程,需要理解JNI的工作原理,以及如何在C/C++中与DLL交互。这个过程对于那些希望在Java中利用已有的本地库功能的开发者来说是至关重要的。

    Java调用Delphi的Dll发送短信演示.rar

    - **导出函数**:在Delphi的DLL中,我们需要定义一个或多个导出函数,这些函数将作为Java与DLL交互的接口。例如,我们可以定义一个名为`SendSMS`的函数,接收必要的参数(如手机号码、短信内容等),并返回发送结果...

    Java调用动态链接库(Java 调用 DLL)

    Java调用动态链接库(DLL)是Java编程中一个比较特殊的技术,主要涉及到Java与本地代码的交互。在Windows系统中,DLL(Dynamic Link Library)是实现函数复用的一种方式,它包含了一系列可供其他程序调用的函数或数据...

    Java调用DLL源代码

    Java调用DLL是Java开发中一个重要的技术主题,它允许Java程序与本地操作系统API或者其他C/C++编写的动态链接库进行交互。在Java中,有多种方法可以实现这个功能,其中最常用的是Java Native Interface (JNA) 和 ...

Global site tag (gtag.js) - Google Analytics