java利用jni调用dll方法
准备工作:
需要用到的插件jni4net:这个需要去官网下载:https://sourceforge.net/projects/jni4net/files/
(1) jni4net 是一个开源的项目
(2) jni4net-0.8.8.0.zip 中是工具的所有文件,包含示例
下载后解压是这样的
打开lib下边有你需要用到的jar包和dll这是关键。
创建C#程序:
打开vs创建一个类库com.demo.lib项目,写上测试程序。
HelloWorld.cs
result.cs
User.cs
编译成功之后,会在bin下的Debug下生成相关的dll。
使用proxygen工具来生成proxy类.
jni4net-0.8.8.0-bin\bin下就有proxygen工具,可以直接在该目录下打开cmd,执行命令:.\proxygen.exe "DLL所在路径" -wd "java项目根路径"
此处我是直接在bin下建了一个文件夹,用于存放生成的文件。生成之后,需要将所有文件拷到java项目根路径下。
执行后会出现以下文件
然后将jni4net的相关文件都拷到java项目的根路径下,执行build.cmd
里面的脚本需要修改成你对应的项目路径。
错误提示:
执行过程中如果提示你某些程序包不存在,说明你没有放到项目路径下,或者说,你没有项目中没有相关的jar包。
如果提示你csc.exe是不可执行的命令,说明你没有配置环境变量,将PATH中加上路径:C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319(环境变量之间用英文分号;隔开),其他方法也可以实现。
执行成功之后会生成一个dll一个jar。
这两个是后边需要用到的。
java部分
我采用的开发工具是IDEA,我在项目根目录下,建了一个文件夹叫,lib,然后将两个jar包拷到lib下面。记住此处要将jar包添加到项目中去。
dll的话,我是采用的第三方路径,别的方法也可以,我简单阐述一下我的方法。我将剩余的dll拷到e盘下dll文件夹中,
然后在配置文件中,配置上相关的路径。
在application.yml加个配置信息
plugins:
dll:
path: e:/dll #dll所在路径
files: com.demo.lib.j4n.dll #加载的dll文件名,是生成的那个
由于我们是采用的外部文件夹的形式,因此需要一个类来初始化加载这个配置信息。
测试程序:
新建一个demo.java的类,需要将之前读取到的dll中的信息读取过去,因此需要这么一个方法:
public List<String> loadPlugins()
{
Logger log = LoggerFactory.getLogger(PluginsLoader.class);
List<String> arr = new ArrayList<>();
String files=pluginsLoader.getFiles().trim();
String path=pluginsLoader.getPath();
if(files.length()>0)
{
File dir = new File(path);
if(dir.exists())
{
log.info("-------start loading plugins,directory is "+path+"-------");
try {
Bridge.init(dir);
String[] fileArr = files.split(",");
for (String f : fileArr) {
File file = new File(dir, f);
if (file.exists()) {
Bridge.LoadAndRegisterAssemblyFrom(file);
arr.add(f);
log.info("plugin loaded:"+f);
} else {
log.warn(f + " not exists,not loaded!");
}
}
log.info("------- load plugins complete -------");
}catch (IOException e)
{
log.error("init bridge failed:"+e.getLocalizedMessage());
}
}
}
return arr;
}
有了这个方法,你就可以调用了
直接上测试程序:
@RequestMapping("/dll")
public String invokeDllFunction()
{
List<String> arr = loadPlugins();
Result rs = null;
User u = new User();
u.setName("张三");
u.SetFirstName("first name");
rs = HelloWorld.StaticGreet(u,"message info");
HelloWorld hw = new HelloWorld();
Result rs2 = hw.Greet(u,"greet info");
return rs.getMessage()+","+rs2.getMessage();
}
示例中,Result、User、HelloWorld三个类都是dll中的,HelloWorld中有一个静态方法,两个重载方法,方法参数有类、字符串,返回类型有void有对象。在c#代码中,User类有一个属性private String Name{get;set},生成的jar中User的setName于getName是自动给加上的getter、setter;
好了,启动试试吧:调用结果:
到这里,基本上就完成了。
使用总结
1、执行脚本,生成jar和dll
2、配置dll的路径等信息
3、将jar添加到java项目并使用
备注:
Springboot引入本地jar,并在生成时复制到对应lib下,对应pom.xml配置:
<dependency>
<groupId>net.sf</groupId>
<artifactId>jni4net</artifactId>
<version>0.8.8.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/jni4net.j-0.8.8.0.jar
</systemPath>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>lib.j4n</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/com.demo.lib.j4n.jar
</systemPath>
</dependency>
<resources>
<resource>
<directory>${project.basedir}/libs</directory>
<targetPath>BOOT-INF/lib/</targetPath>
<filtering>false</filtering>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
java利用jni调用dll方法的更多相关文章
- Java通过JNI调用dll详细过程(转)
源:Java通过JNI调用dll详细过程 最近项目有这样一个需求,在已有的CS软件中添加一个链接,将当前登录用户的用户名加密后放在url地址中,在BS的login方法里通过解密判断,如果为合法用户则无 ...
- Java利用JNI调用C/C++写成的DLL
前言 由于学期作业的要求,笔者需要开发一个语音识别系统.出于对Java的热爱,笔者非常想用Java来写上层程序(前台+数据库的三层),又要用到Microsoft Speech SDK,所以在这些条件下 ...
- Java使用JNI调用DLL库
JNI是Java自带的方法,不需要引入第三方jar包,优点是因为是java自带的方法,兼容性较好,缺点就是代码书写繁琐 新建Java项目Test --> 新建测试类TestNative,声明本地 ...
- JAVA使用JNI调用C++动态链接库
JAVA使用JNI调用C++动态链接库 使用JNI连接DLL动态链接库,并调用其中的函数 首先 C++中写好相关函数,文件名为test.cpp,使用g++编译为DLL文件,指令如下: g++ -sha ...
- [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...
- [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so
0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...
- Java使用JNA调用DLL库
Java调用DLL方法有三种,JNI.JNA.JNative, 本文为JNA JNA为使用jna.jar包,下载地址:http://www.java2s.com/Code/Jar/j/Download ...
- ubuntu下Java通过JNI调用C
下面看一个实例,如下: public class TestJNI { static { System.loadLibrary("diaoyong"); // 程序在加载时,自动加载 ...
- LoadRunner 调用dll方法
本文主要介绍简单DLL的编写方法及在LoadRunner中局部调用与全局调用DLL方法. 1.动态链接库的编写 在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择W ...
- java 用JNA调用dll 参考文档
1 Java调用C语言动态库(JNA方式):回调函数.结构体数组传参.结构体数组返回 2jna结构体数组 JNA结构体数组 3JNA调用C语言动态链接库学习实践总结 4 Java 通过 JNA 调 ...
随机推荐
- vue中新的状态管理器-pinia
背景 对于pinia的使用,可参考官方文档在这不做过多赘述.这边主要来讲讲pinia中 少用且好用的方法,为什么我们选择pinia而不用vuex ps: 以下写法全部基于组合式API 使用方式: 先下 ...
- 什么?又来智能AI编程?让不让我们活了!
无事逛github发现了一款智能AI编程,故下载试试 发现异常好用 推荐给大家 github地址:GitHub - getcursor/cursor:一个用于使用AI 编程的编辑器 支持:C# ,Ja ...
- Solon v2.2.7 发布,支持 Java 8 到 Java 20
Solon 是一个高效的 Java 应用开发框架:更快.更小.更简单.也是一个有自己接口标准规范的开放生态. 150来个生态插件,覆盖各种不同的应用开发场景: 相对于 Spring Boot 和 Sp ...
- ML - Regression
Regression Machine Learning 机器学习的意义就在于让机器具备找一个函数(function)的能力 Different types of Functions Regressio ...
- [ACM]STL-dfs
#include<iostream> using namespace std; int book[101],sum,n,e[101][101]; void dfs(int cur) { c ...
- 帝国cms 随机调取新闻
<?php $hits_r = $empire->query("select * from {$dbtbpre}ecms_music as t1 join (select rou ...
- JSON.stringify()与JSON.parse()没有你想的那样简单
重新学习这两个API的起因 在本周五有线上的项目,16:30开始验证线上环境. 开始都是顺顺利利,一帆风顺. 大概17:50左右,我正在收拾东西. 准备下班去王者峡谷骑着我的船溜达一圈. 可是天降意外 ...
- 【译】ConfigureAwait FAQ
.NET 在数年前就在语言和库中添加了 async/await.在那段时间里,它像野火一样蔓延开来,不仅在 .NET 生态系统中,而且在无数其他语言和框架中被复制.在 .NET 中也看到了大量的改进, ...
- Html/css 列表项 区分列表首尾
列表项,有时需要判断列表首尾,来筛选设置样式 如上图,三个项有间隔,怎么保证设置了列表项之间的距离后,整体还水平居中显示呢? .item:not(:first-child) { margin-left ...
- Driver8833电机驱动模块的使用(STM32为主控)
一.硬件 STM32C8T6.STLINK下载器 Driver8833:TI公司的DRV8833是双桥马达驱动器解决方案,包括有两个H桥驱动器,可驱动两个DC电刷马达,或一个步进马达, 螺线管和其它电 ...