`

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是怎么样交互,如何自己写dll,跨语言的交互问题,代码通过测试

    java和dll交互代码

    java和dll交互 参考文章:https://www.jianshu.com/p/7f9b6d3af297

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

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

    Java采用JNI调用VC++生成的dll(Java与C++交互)

    Java采用JNI调用VC++生成的dll(Java与C++交互)

    java与Delphi写的dll交互

    NULL 博文链接:https://abstractforever.iteye.com/blog/756142

    java&dll;交互混合.rar

    java调用dll(VC开发)交互混合开发实例源码,其中自带了JAVA源码以及DLL的源码,DLL采用VC开发,演示了传参、调用之间的关系,希望对你有用

    java调用dll最简单的方法

    在Java中调用DLL(Dynamic Link Library)文件,可以使用Java的本地方法接口(JNI,Java Native Interface)来实现。JNI允许Java程序与本地代码进行交互,从而实现跨平台的功能。

    android_JNI介绍

    目前Java与Dll交互的技术主要有三种:JNI、JAWIN和JACOB,JNI(Java Native Interface)是SUN提供的Java与系统中的原生方法的技术。JACOB(Java-Com Bridge)提供Java程序调用Microsoft的com队形的方法能力,而除了com...

    JAVA使用dll动态库

    JNI基本实现过程,快速了解java与c如何交互,为从事ndk开发迈出一步!

    java与sap交互 jco包

    有jar包 还有dll文件 把jar包导入项目 把两个dll文件复制到system32下面

    java调用dll或so库示例

    完整演示使用JNI开发JAVA和C++交互的例子,本示例提供了在Windows和linux上的编译脚本。请参考JNI的相关文章,如有疑问可留言

    Dalvik知识收集

    目录(导读) 一、Dalvik虚拟机工作原理介绍 二、Dalvik与Androi架构 三、JNI技术(java与dll交互的技术) 四、Dex文件结构 五、Apk文件结构、dex反编译 5.2 反编译工具Dedexer 六、JAVA虚拟机的结构解析

    JNI学习示例代码,含java代码工程和win32 dll工程

    通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。...

    java写dll接口源码-JNI-By-Examples::sparkler:有趣的JavaJNI示例-使用CMake和C++(当然也可以是C!):double_exclamation_mark:接受PR

    java写dll接口源码(介绍)Java 本机接口编程,通过示例 注意:我现在正在考虑向本教程添加内容。 如果您有建议或新增内容,请不要犹豫。 目录 前言 注意:我在 2017 年初写了这篇文章,因为需要将图像序列化任务从 ...

    java 使用qt 开发gui 界面的qtjambi 开发包(完整版)

    在使用java 进行qt 界面开发的时候,必不可少的qt jambi 开发包。 下载压缩包后 将其中的 jar导入项目的build path。 然后,在安装了qtjambi 插件的eclipse 中的 Qt Jambi Preference Page 的 Jambi Location 处...

Global site tag (gtag.js) - Google Analytics