准备工作:

需要用到的插件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. ACM-刷题记录-14届NEFU校赛

    P2031凯撒密码 #include<bits/stdc++.h> using namespace std; int main(){ string s; int d; while(cin& ...

  2. 鸿蒙开发学习笔记-UIAbility-Router页面跳转接口源码分析

    在鸿蒙开发中,UIAbility的跳转使用 router 方法. 在使用的时候需导入 import router from '@ohos.router'; 该方法接口成员如下: 1.interface ...

  3. MordernC++之 auto 和 decltype

    在C++11标准中,auto作为关键字被引入,可以用来自动推导变量类型,auto可以用于定义变量,函数返回值,lambda表达式等,在定义变量时可以使用auto来代替具体类型,编译器根据变量初始化表达 ...

  4. Unable to find real location for: <frozen codecs>

    问题描述 pycharm 在debug时出现了如下bug ----------------------------------------------------------------------- ...

  5. vue常用标签(引入vue.js写法)

    首先在html中引入vue.js,具体怎么下载可以参考https://blog.csdn.net/lvoelife/article/details/129254906,下载后在html中引入: 一 内 ...

  6. 【Vue2.x源码系列06】计算属性computed原理

    上一章 Vue2异步更新和nextTick原理,我们介绍了 JavaScript 执行机制是什么?nextTick源码是如何实现的?以及Vue是如何异步更新渲染的? 本章目标 计算属性是如何实现的? ...

  7. o(nlogn)求最长上升子序列

    \(O(nlog_n)\)求最长上升子序列LIS 假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5.下面一步一步试着找出它. 我们定义一个序列B,然 ...

  8. JS 实现关键字文本搜索 高亮显示

    示例:  利用字符串的 split 方法,通过搜索的关键字分割成数组  在利用数组的 join 方法拼接成字符串 我是利用mock的省份 1 <template> 2 <div cl ...

  9. OpenCV-Python 中文教程

    OpenCV-Python 中文教程 目录 I 走进 OpenCV 关于 OpenCV-Python 教程 在 Windows 上安装 OpenCV-Python 在 Fedora 上安装 OpenC ...

  10. 基于pip的python包管理工具

    以下是软件下载链接:https://mysecreat.lanzoub.com/i5yvf0swgtne 软件功能:可以对python包进行安装.卸载.升级.换源等操作,不用输入复杂命令 源码: im ...