java jni dll_java利用jni调用dll方法

本文介绍了如何利用jni4net工具在C#和Java之间建立桥梁,进行跨平台调用。首先,详细解释了jni4net的安装和配置过程,包括创建C#类库、生成代理类、配置DLL路径等步骤。接着,展示了在Java项目中如何引用生成的jar和dll,以及如何编写测试代码调用C#的方法。最后,提供了完整的测试程序实例,包括加载DLL、调用方法等关键步骤,帮助读者理解并实践C#与Java的交互操作。
摘要由CSDN通过智能技术生成

准备工作:

(1)     jni4net 是一个开源的项目

(2)     jni4net-0.8.8.0.zip 中是工具的所有文件,包含示例

下载后解压是这样的

4ac4a832e89c7b62e0db6c061eeecb41.png

打开lib下边有你需要用到的jar包和dll这是关键。

6dba93e4218eda3265abafa111fa5f71.png

创建C#程序:

打开vs创建一个类库com.demo.lib项目,写上测试程序。

HelloWorld.cs

b16e6d5dfc5b1374b762537f91a43d93.png

result.cs

01db18fc291fdc8881c8a9c36d7f0bfb.png

User.cs

2e1832ff7d8bf5e2a1f44ad7eae91cc6.png

编译成功之后,会在bin下的Debug下生成相关的dll。

使用proxygen工具来生成proxy类.

jni4net-0.8.8.0-bin\bin下就有proxygen工具,可以直接在该目录下打开cmd,执行命令:.\proxygen.exe "DLL所在路径" -wd "java项目根路径"

此处我是直接在bin下建了一个文件夹,用于存放生成的文件。生成之后,需要将所有文件拷到java项目根路径下。

9fc3c1641e81d332138b1d3cbde2c723.png

执行后会出现以下文件

ae4a64ea8c4857d990a43049d36c6e99.png

然后将jni4net的相关文件都拷到java项目的根路径下,执行build.cmd

1c2648f71e69d4b0029242ee67a06517.png

里面的脚本需要修改成你对应的项目路径。

错误提示:

执行过程中如果提示你某些程序包不存在,说明你没有放到项目路径下,或者说,你没有项目中没有相关的jar包。

如果提示你csc.exe是不可执行的命令,说明你没有配置环境变量,将PATH中加上路径:C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319(环境变量之间用英文分号;隔开),其他方法也可以实现。

执行成功之后会生成一个dll一个jar。

093b7f501f6475115883216e3657dd1e.png

这两个是后边需要用到的。

java部分

我采用的开发工具是IDEA,我在项目根目录下,建了一个文件夹叫,lib,然后将两个jar包拷到lib下面。记住此处要将jar包添加到项目中去。

b924ac365c3409d849855b0512d592ff.png

dll的话,我是采用的第三方路径,别的方法也可以,我简单阐述一下我的方法。我将剩余的dll拷到e盘下dll文件夹中,

5c58bb5dd5904d1c1a1a93b25c56e76c.png

然后在配置文件中,配置上相关的路径。

在application.yml加个配置信息

plugins:

dll:

path:e:/dll #dll所在路径

files:com.demo.lib.j4n.dll #加载的dll文件名,是生成的那个

由于我们是采用的外部文件夹的形式,因此需要一个类来初始化加载这个配置信息。

f7b09cad84401a3013da3605bf01c1bd.png

测试程序:

新建一个demo.java的类,需要将之前读取到的dll中的信息读取过去,因此需要这么一个方法:

public List loadPlugins()

{

Logger log = LoggerFactory.getLogger(PluginsLoader.class);

List 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 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;

好了,启动试试吧:调用结果:

d4dd2f56a4073a17328d8d6d837415f1.png

到这里,基本上就完成了。

使用总结

1、执行脚本,生成jar和dll

2、配置dll的路径等信息

3、将jar添加到java项目并使用

备注:

Springboot引入本地jar,并在生成时复制到对应lib下,对应pom.xml配置:

net.sf

jni4net

0.8.8.0

system

${project.basedir}/libs/jni4net.j-0.8.8.0.jar

com.demo

lib.j4n

1.0.0

system

${project.basedir}/libs/com.demo.lib.j4n.jar

${project.basedir}/libs

BOOT-INF/lib/

false

*.jar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值