• c语言源码生成dll文件并供java调用详细教程


    一、环境准备

    本次教程环境基于jdk19(java环境),MinGW 8.1.0 (C语言环境,下载地址

    二、dll文件的制作

    java要想成功调用dll文件,需要在dll制作的过程中由java生成头文件供C语言的程序调用并生成dll,否则会出现如下错误

    Exception in thread "main" java.lang.UnsatisfiedLinkError: 'float[] com.jc.transfer.testClient.distributionCalculation(float[], int)'
    
    • 1

    该错误是因为java找不到dll中对应的方法。

    现在通过一个简单的求和函数来介绍如何生成java可以调用的dll文件:

    1.1 通过java生成头文件

    在java项目工程下创建dllDemo.java,并写上求和接口Add,需要用native修饰。注意这里的包名。

    package com.jc.transfer.utils;
    
    public class dllDemo {
        public native int Add(int a,int b);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    随后通过命令行的方式进入当前文件所在目录,输入

    javac dllDemo.java -h .
    
    • 1

    如图所示:
    在这里插入图片描述
    执行上述命令之后会在当前目录下生成两个文件dllDemo.classcom_jc_transfer_utils_dllDemo.h
    在这里插入图片描述
    com_jc_transfer_utils_dllDemo.h文件内容如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include 
    /* Header for class com_jc_transfer_utils_dllDemo */
    
    #ifndef _Included_com_jc_transfer_utils_dllDemo
    #define _Included_com_jc_transfer_utils_dllDemo
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_jc_transfer_utils_dllDemo
     * Method:    Add
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_com_jc_transfer_utils_dllDemo_Add
      (JNIEnv *, jobject, jint, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    这里可以发现生成的头文件对应的Add方法和java文件所在的包名相对应,这也是为什么调用不是自己生成的dll文件会出现异常的原因了,最后我们需要将#include 修改为#include "jni.h",后续需要导入jni.h文件。

    1.2 通过头文件编写C语言程序并生成dll文件

    在头文件同级目录下创建dllDemo.c文件,内容如下,注意和头文件内Add函数的区别

    #include "jni.h"
    #include 
    #include "com_jc_transfer_utils_dllDemo.h"
    JNIEXPORT jint JNICALL Java_com_jc_transfer_utils_dllDemo_Add
      (JNIEnv *evn, jobject obj, jint a, jint b){
    	return a+b;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    其中jni.h是jdk自带的文件,找到jdk安装目录下的include目录
    在这里插入图片描述
    将jni.h文件以及win32下的jni_md.h一同复制到dllDemo.c所在目录
    在这里插入图片描述
    最后命令行进入当前目录,输入如下命令生成dllDemo.dll文件,其中${JAVA_HOME}为配置的java环境变量

    g++ -shared -o dllDemo.dll -I${JAVA_HOME}/include -I${JAVA_HOME}/include/java dllDemo.c
    
    • 1

    在这里插入图片描述
    在这里插入图片描述

    三、java调用生成的dll文件

    我们在dllDemo.java文件中测试生成的dll。

    package com.jc.transfer.utils;
    
    public class dllDemo {
        public native int Add(int a,int b);
        static {
            System.load("D:\\ideaWorkspace\\waterTransfer\\src\\main\\java\\com\\jc\\transfer\\utils\\dllDemo.dll");
        }
    
        public static void main(String[] args) {
            dllDemo demo = new dllDemo();
            System.out.println(demo.Add(2, 4));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

  • 相关阅读:
    Java之@Autowired再分析
    2022杭电多校第一场
    云计算到底牛x在哪里?
    Notion 类笔记软件如何选择?Notion 、FlowUs、Wolai 对比评测
    【工具】Sublime配置Anaconda的Python环境的简单方法
    Java对指定不规则的jsonString读取并操作
    Windows10环境下如何打开远程桌面
    徐童:视频人物社交关系图生成与应用
    链接装载与库:第十二章——系统调用与API
    Java面试学习资源
  • 原文地址:https://blog.csdn.net/weixin_42684368/article/details/136446505