准备工作:

需要用到的插件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方法的更多相关文章

  1. Java通过JNI调用dll详细过程(转)

    源:Java通过JNI调用dll详细过程 最近项目有这样一个需求,在已有的CS软件中添加一个链接,将当前登录用户的用户名加密后放在url地址中,在BS的login方法里通过解密判断,如果为合法用户则无 ...

  2. Java利用JNI调用C/C++写成的DLL

    前言 由于学期作业的要求,笔者需要开发一个语音识别系统.出于对Java的热爱,笔者非常想用Java来写上层程序(前台+数据库的三层),又要用到Microsoft Speech SDK,所以在这些条件下 ...

  3. Java使用JNI调用DLL库

    JNI是Java自带的方法,不需要引入第三方jar包,优点是因为是java自带的方法,兼容性较好,缺点就是代码书写繁琐 新建Java项目Test --> 新建测试类TestNative,声明本地 ...

  4. JAVA使用JNI调用C++动态链接库

    JAVA使用JNI调用C++动态链接库 使用JNI连接DLL动态链接库,并调用其中的函数 首先 C++中写好相关函数,文件名为test.cpp,使用g++编译为DLL文件,指令如下: g++ -sha ...

  5. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  6. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  7. Java使用JNA调用DLL库

    Java调用DLL方法有三种,JNI.JNA.JNative, 本文为JNA JNA为使用jna.jar包,下载地址:http://www.java2s.com/Code/Jar/j/Download ...

  8. ubuntu下Java通过JNI调用C

    下面看一个实例,如下: public class TestJNI { static { System.loadLibrary("diaoyong"); // 程序在加载时,自动加载 ...

  9. LoadRunner 调用dll方法

    本文主要介绍简单DLL的编写方法及在LoadRunner中局部调用与全局调用DLL方法. 1.动态链接库的编写 在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择W ...

  10. java 用JNA调用dll 参考文档

    1  Java调用C语言动态库(JNA方式):回调函数.结构体数组传参.结构体数组返回 2jna结构体数组  JNA结构体数组 3JNA调用C语言动态链接库学习实践总结 4 Java 通过 JNA 调 ...

随机推荐

  1. window的子对象

    在控制台输入 history history.length 历史记录个数history.back() 后退history.forward() 前进history.go(n) 跳到某一页,可正可负,当n ...

  2. 超全 泛微 E9 Ecology 9开发资料大全 开源资源下载 泛微E9二次开发 泛微开发实战经验 泛微开发实战例子 泛微二次开发项目例子 泛微二次开发Demo 泛微二次开发完整例子 泛微二次开发入门

    由于工作需要,E9在泛微一推出来,以前所在的企业就第一时间上线了,经过四年多的运行,功能强大再加上在上面开发非常多的业务,一般的企业员工只需要打开泛微就可以处理完平时信息化的业务.后来又去外包公司专业 ...

  3. flask配置config详解

    flask系列讲座与2017年12月6日开始,每周一篇.第三篇其中讲述flask的配置方法.使用app.config.from_object()方法,似乎很神奇.如果明白背后逻辑,实际上很自然.涉及代 ...

  4. LLaMA:开放和高效的基础语言模型

    LLaMA:开放和高效的基础语言模型 论文:https://arxiv.org/pdf/2302.13971.pdf 代码:https://github.com/facebookresearch/ll ...

  5. [SrpingBoot]初步搭建springboot应用,报错:Failed to configure a DataSource: 'url' attribute is not specified and no embedd[转载]

    1 错误信息 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource ...

  6. JSON.parse 函数 (JavaScript)

    将 JavaScript 对象表示法 (JSON) 字符串转换为对象. 语法 参数 返回值 异常 以下示例使用 JSON.parse 将 JSON 字符串转换成对象. var jsontext = ' ...

  7. VUEX(状态管理)之憨憨篇

    1.导入vuex包 import vuex from 'vuex' 2.注册vuex到vue中 vue.use(vuex) 3.new vuex.store() 得到一个数据存储对象 var stor ...

  8. html/css 添加图片

    通过img.src添加图片 添加一个img元素,设置content,会发现在IE.safari等浏览器内显示为空白. 一般我们使用img,是通过src来设置的,可以通过react的import图片添加 ...

  9. C# 组合键判断

    e.KeyboardDevice.Modifiers 同时按下了Ctrl + H键(H要最后按,因为判断了此次事件的e.Key)修饰键只能按下Ctrl,如果还同时按下了其他修饰键,则不会进入 1 pr ...

  10. YOLO2论文中文版

    文章目录 YOLO9000中文版 摘要 1. 引言 2. 更好 3. 更快 4. 更强 5. 结论 参考文献 YOLO9000中文版 摘要 我们引入了一个先进的实时目标检测系统YOLO9000,可以检 ...