java 调用C#语言写的dll文件代码 超详细过程

前言
最近在编写项目时候,遇到了java调用C#类库的情况,试了很多种方法,也遇到了很多坑。解决之后写下来。作为记录和分享给有用的朋友们。在这里我用的工具是jni4net-0.8.8.0,Visual Studio2015

一、编写C#类库代码,并生成DLL文件。
1.按如图步骤用Visual Studio(我用的vs2015)新建一个C#的类库项目,项目名称为HelloWorld。

在这里插入图片描述

在这里插入图片描述
创建C#类库项目步骤

2.重命名类名Hello

在这里插入图片描述
3.类库代码
namespace HelloWorld
{
    public class Hello
    {
        public static int display(int a,int b)
        {
            return a+b;
        }
    }
}

4.右键项目,生成。编译成dll

在这里插入图片描述 


二、编写java代码
1.用jni4net工具把dll文件编译;(jni4net工具下载地址:jni4net - Browse Files at SourceForge.net)
文件夹找到jni4net的bin目录,创建cmd命令文件,方便后续使用;
命令:.\proxygen.exe “DLL所在路径” -wd “java项目根路径”
如:.\proxygen.exe “D:\Java\HelloWorld.dll” -wd “E:\Project\Jni4netProject”
执行后java项目的根目录下会多出下图红色框中的文件和一个build.cmd文件

(运行是可能会遇到javac' 不是内部或外部命令,也不是可运行的程序 或批处理文件和'csc' 不是内部或外部命令,也不是可运行的程序 或批处理文件;需要配置JDK环境变量JDK 安装 Java环境变量配置 详细教程_yyongsheng的博客-CSDN博客和Microsoft.NET的环境变量在dos下用csc命令编译,提示“csc不是内部或外部命令,也不是可运行的程序”_yyongsheng的博客-CSDN博客)

在这里插入图片描述
2.将dll文件打包乘jar包
将命令行切换到java项目的根目录下(和src同级目录),执行命令build.cmd,java项目根目录下会编译出2个文件分别为HelloWorld.j4n.dll和HelloWorld.j4n.jar,
如下图:

在这里插入图片描述
3.拷贝文件并添加jar包依赖;
然后将jni4net的lib目录下的jar文件和dll文件copy到java项目的根目录下,将C#项目的HelloWorld.dll的文件也copy到java项目的根目录下, 

在这里插入图片描述


添加依赖的方式有多种(我用的第一种),如:
1.将HelloWorld.j4n.jar和jni4net.j-0.8.8.0.jar添加到File—Progect Structure --Modules–Depengdenies–

在这里插入图片描述

2.把jar包放到指定位置,在pom文件中添加依赖,如:

        <dependency>
            <groupId>com.xgtx</groupId>
            <artifactId>ObcClient.j4n</artifactId>
            <version>1.0.1</version>
            <scope>system</scope>
            <systemPath>C:/dll/ObcClient.j4n.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.xgtx</groupId>
            <artifactId>jni4net.j</artifactId>
            <version>1.0.1</version>
            <scope>system</scope>
            <systemPath>C:/dll/jni4net.j-0.8.8.0.jar</systemPath>
        </dependency>

4.java代码
public static void main(String[] args) {
        Bridge.setVerbose(true);
        Bridge.init();
        File dll = new File(  "HelloWorld.j4n.dll");
        Bridge.LoadAndRegisterAssemblyFrom(dll);
        int result =helloWorld.Hello.display(66,22);
        System.out.println("计算结果为:"+result);
    }
并执行:

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java调用C语言主要是通过JNIJava 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代码实现更高效的程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值