java 调用C#语言写的dll文件代码 超小白教程

遇到了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

删除过程代码

可以保留,只不过对项目没有意义

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Java调用C语言主要是通过JNI(Java Native Interface)来实现的。JNI是一种Java应用程序与本地代码(如C或C++)进行交互的机制。 首先,需要编一个C语言的共享库(也称为动态链接库或DLL)。在C代码中,使用`#include <jni.h>`包含JNI的头文件,定义一个`JNIEXPORT`修饰的方法,该方法会在Java中被调用。在这个方法中,可以执行C语言的操作,或者通过调用Java提供的JNI函数来与Java进行交互。 编完C代码后,需要使用编译器将其编译成共享库文件。在Windows环境下,可以使用命令行运行`gcc -shared -o libexample.dll example.c`命令进行编译。在Linux环境下,可以使用`gcc -shared -o libexample.so example.c`命令进行编译。 在Java代码中,使用`System.loadLibrary()`方法加载已编译的共享库文件。然后,通过`native`关键字将Java方法声明为本地方法。在方法体内部,可以调用C语言的方法。 例如,假设C代码中定义了一个`JNIEXPORT void JNICALL Java_com_example_NativeExample_nativeMethod(JNIEnv *env, jobject obj)`方法,在Java中可以通过以下代码调用该方法: ``` class NativeExample { public native void nativeMethod(); static { System.loadLibrary("example"); } } public class Main { public static void main(String[] args) { NativeExample example = new NativeExample(); example.nativeMethod(); } } ``` 需要注意的是,调用C代码时需要处理好Java和C之间的类型转换和内存管理。JNI提供了一些函数来实现这些功能,如`GetMethodID()`、`CallVoidMethod()`和`GetArrayElements()`等。 总之,Java通过JNI调用C语言主要是通过编C共享库,并使用JNI函数来与Java进行交互。通过合理使用JNI提供的函数,可以在Java调用C代码并实现更高效的程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值