遇到了java调用C#类库的情况,在网上找了几种方法:jni4net、jna,最终选择了jni4net,可以全部打包在项目中。这里作为记录和分享给有用的朋友们。
工具:
1.jni4net-0.8.8.0,提供下载0积分下载地址https://download.csdn.net/download/dqfe123/87541593
2.Visual Studio2022,请至官网下载
C#部分
新建项目
新建方式
方法一:
方法二:
选择 类库(.NET Framework)
项目名称:
输入“HelloWorld”
重命名类名
输入“Hello”
完善执行方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloWorld
{
public class Hello
{
public static int display(int a, int b)
{
return a + b;
}
}
}
调整配置
打开程序集信息
勾选COM
设置CPU类型
Ctrl + S 保存
生成dll
执行完成后:C:\Users\Administrator\source\repos\HelloWorld\HelloWorld\bin\Debug\HelloWorld.dll
至此,C#生成dll部分完成
jni4net:
1.解压工具包
压缩包解压至 D:\Tools\jni4net-0.8.8.0
2.转换dll
生成c++和java 源码:
D:\Tools\jni4net-0.8.8.0\bin\proxygen.exe "D:\project\test\jni4net\HelloWorld.dll" -wd "D:\project\test\jni4net"
执行完毕的项目文件目录
生成jar
执行命令:build.cmd
#切换盘符
d:
#切换目录
cd D:\project\test\jni4net\
#执行命令
build.cmd
如果出现上面异常则是 没有配置Framework环境变量
文件管理器:C:\Windows\Microsoft.NET\Framework
选择4.x版本,记住目录路径,添加至环境变量 PATH
重新打开cmd 执行上面的命令
至此dll转换完毕
JAVA
1.打开项目
2.复制jni4net相关库到项目
3. maven项目
新建pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.shr25</groupId>
<artifactId>jni4net</artifactId>
<version>1.0</version>
<name>jni4net</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<skipTests>true</skipTests>
</properties>
<dependencies>
<dependency>
<groupId>com.xgtx</groupId>
<artifactId>HelloWorld.j4n</artifactId>
<version>1.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/HelloWorld.j4n.jar</systemPath>
</dependency>
<dependency>
<groupId>com.xgtx</groupId>
<artifactId>jni4net.j</artifactId>
<version>1.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/jni4net.j-0.8.8.0.jar</systemPath>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
转换maven项目
创建测试类
Test类:
import helloworld.Hello;
import net.sf.jni4net.Bridge;
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
Bridge.setVerbose(true);
Bridge.init();
File dll = new File( "HelloWorld.j4n.dll");
Bridge.LoadAndRegisterAssemblyFrom(dll);
int result = Hello.display(66,22);
System.out.println("计算结果为:"+result);
}
}
运行代码
截图无法上传,控制台显示一下内容:计算结果为:88 ,标识dll调用成功
loading core from D:/project/test/jni4net/jni4net.n-0.8.8.0.dll
loading jni4net.n-0.8.8.0, Version=0.8.8.0, Culture=neutral, PublicKeyToken=134a23405600bab4 from D:\project\test\jni4net\jni4net.n-0.8.8.0.dll
loaded jni4net.n-0.8.8.0, Version=0.8.8.0, Culture=neutral, PublicKeyToken=134a23405600bab4 from D:\project\test\jni4net\jni4net.n-0.8.8.0.dll
Initialized jni4net core
core loaded from D:/project/test/jni4net/jni4net.n-0.8.8.0.dll
clr.version :v4.0.30319
clr.arch :64bit
java.home :D:\Tools\Java\jdk1.8.0_181\jre
java.version :1.8.0_181
sun.arch.data.model :64
loading HelloWorld.j4n, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null from D:\project\test\jni4net\HelloWorld.j4n.dll
loaded HelloWorld.j4n, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null from D:\project\test\jni4net\HelloWorld.j4n.dll
计算结果为:88
Process finished with exit code 0
删除过程代码
可以保留,只不过对项目没有意义