您的位置:首页 > 编程语言 > C语言/C++

JNA之动态链接库生成及调用详解JAVA—C++(.dll)Windows版

2019-04-19 14:58 459 查看

JNA之动态链接库生成及调用详解JAVA—C++(.dll)Windows版

首先说下开发环境:VS2017+JDK1.8+JNA4.2+JAVA-IDE(eclipse)

需要Linux环境下的动态库编译可以点击这里查看

JNA(Java Native Access)是一个开源的Java框架,是Sun公司推出的一种调用本地方法的技术,是建立在经典的JNI基础之上的一个框架。之所以说不使用JNI而选择JNA,是因为JNA大大简化了调用本地方法的过程,使用很方便,基本上不需要脱离Java环境就可以完成。

动态链接库其实就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。

由于项目是通过C++进行开发,需要通过代码生成库文件供JAVA调用,故选择工具JNA作为JAVA与C++之间的桥梁。

首先下载JNA:点击下载
进入后是github上的源码下载界面,如果需要下载发布版,进行如下操作

点击后进去如下界面选择你所有需要的版本进行下载
注:windows平台下载zip文件 Linux平台下载tar.gz文件

桥梁已经搭建好,接下来是需要c++的动态库文件了,生成步骤也是简单

打开VS2017–文件–新建项目–Visual C+±-windows桌面向导

更改好项目名和存储位置,以便后续查找!!!
在应用程序类型复选框中选择动态库链接库(.dll),其他选项中选择空项目

之后生成一个空项目,在空项目中相应的部分添加.h头文件和.cpp源文件

这里我的项目名为hello,故头文件hello.h源文件hello.cpp,当然文件名不一定需要和项目同名

头文件中语句内容

#ifdef HELLO_API
#else
#define HELLO_API extern "C" __declspec(dllexport)
#endif

HELLO_API int add(int a, int b);

注意
extern “C”,此语句一定需要添加,不然你不知道它导出供我们使用的函数API是什么,因为不加生成的API不是我们写的API函数,后面会加一点符号,这个需要通过反编译器查看

具体参考博客extern “C”

源文件中语句内容

#include "hello.h"

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

最后生成解决方案
在对应的项目文件夹下有如下文件

我这里用的是release x64模式进行编译在项目文件的x64 release文件中进行查找,找不到请对应自己的编译模式进行查找

这就生成了我们所需要的动态链接库.dll文件,首先在VS上进行C++调用.dll实验,如果连C++生成的动态库自己都不能调用的话,那JAVA是肯定不行的。重新创建一个自己的项目文件,在此之前需要把生成的.dll和.lib以及.h文件添加到新建项目的目录下,这样才能保证项目能找到我们的动态库,并自动链接上。

.h文件在自己动态库项目的文件夹下

调用的项目代码

#include "hello.h"
#define HELLO_API __declspec(dllimport)
#pragma comment(lib,"hello.lib")

#include<iostream>
using namespace std;

int main()
{
int max=add(3, 8);
cout << "max=" << max << endl;
return 0;
}

最后结果:

成功!!!

接下来使用JNA实现JAVA的调用

首先本人使用的JAVA IDE是eclipse,进入软件新建JAVA项目,调用之前需要将上文提到的JNA下载下来后的jar包导入到自己的项目中

具体的导入方式网上例子很多就不再过多的叙述,留下一个关于eclipse导入包的链接

最后导入之后会有如下形式

这个表示导入成功

然后是写JAVA代码进行C++的.dll调用了

调用代码

package testJNA;

import java.util.Scanner;
import com.sun.jna.Native;
import com.sun.jna.Library;

public class HelloWord {
public interface JNA extends Library{
JNA INSTANCE=(JNA)Native.loadLibrary("HELLO",JNA.class);
int add(int a,int b);
}
public static void main(String[] args) {
int result=JNA.INSTANCE.add(5,13);
System.out.println("result="+result);
}
}


成功!!!

现在可以去写自己项目代码的dll文件了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: