【IntelliJ IDEA 2019.2】vs2008编写C++ dll,被java调用
发布日期:2021-05-13 00:03:33 浏览次数:37 分类:精选文章

本文共 2463 字,大约阅读时间需要 8 分钟。


创建一个C++项目,生成DLL文件,并在不同语言中调用它

...

一、创建C++项目

在Visual Studio 2008中创建一个新的项目

  • 打开Visual Studio,创建一个新的“项目”或“解决方案”

  • 选择项目类型为“默认模板”中建议的“动态链接库(DLL)项目”

  • 为项目添加必要的包含和预设

  • ...

    二、生成DLL

    轮到重要步骤:把代码编译出来

  • 确认生成选项
    • 选择编译器的版本:确保选择“ usando-toolset对于-C++(默认是v100)”

    • 选择优化选项:测试时建议不选,避免内存占用过多

    1. 生成
      • 项目菜单栏-click,选择“生成”(Build)

      • 等待生成完成,查看是否有错误

      1. 调试
        • 项目菜单栏-click,选择“调试”(Debug)或“调试并步-through”(如果需要调试)

        ...

        三、修改配置:正确的DLL导出方法

      2. 添加_mirror的关键点:避免静态链接
        • 使用MTd可能出现问题:这是一个易错点

        • 随着你只需要一个DLL,我不建议使用MTd属性,给DLL一个全新的导出方式

        1. 管理MFC配置:
          • 如果你使用MFC相关功能,确保在项目属性中正确设置DLL的依赖项

          • 以最简单方式解决配置问题:删除MFC代码

          ...

          三、编写代码:简单的返回字符串函数

          以下是实现一个间接调用函数的典型示例

          // 内容提取
          #include
          // 定义一个外部函数,用于export
          __declspec(dllexport) char* go(char* ch) {
          // 显示消息框的示例代码(可以保留或删除)
          // MessageBox(NULL, TEXT(ch), TEXT("你好"), MB_OK);
          return "来自DLL的问候";
          }

          四、测试代码:验证调用成功

        2. 使用C++测试代码:
        3. // 编写测试代码
          #include
          #include
          // 下载相关头文件
          void main() {
          char* result = go("输入内容");
          cout << result << endl;
          // 释放内存
          if (result) {
          free(result);
          }
          // 停止程序
          // 也可以用while循环以保持窗口打开
          while (true) {
          Sleep(100);
          }
          }
          1. 对于更加复杂的测试:分成多个文件
            • 修改头文件SerialPort_dll.h
            #pragma once
            #include
            #include
            // 定义一个Dll版本
            typedef char* (*pType_go)(char*);
            // declare the library
            extern HINSTANCE hDll;
            extern pType_go go;

            ...

            五、Java调用DLL:解决常见问题

          2. 使用JNA库来调用=C++=DLL
            • 拥有JNA库:在项目中添加依赖项

            • 配置JNA属性:确保你的代码正确导入库

            1. 代码示例:
            2. import com.sun.jna.Library;
              import com.sun.jna.Native;
              public class JnaTest {
              public static void main(String[] args) {
              // 设置JNA编码,避免乱码
              System.setProperty("jna.encoding", "GBK");
              // 导入你的DLL
              DllInterface instance = (DllInterface) Native.loadLibrary(
              "SerialPort.dll",
              DllInterface.class
              );
              // 调用DLL中的函数
              String response = instance.go("输入内容");
              System.out.println(response);
              }
              }

              六、解决常见错误

            3. 提示错误:“%1 不是一个有效的Win32应用程序”
              • DLL文件类型问题:确保生成的是DLL而非可执行文件

              • 检查文件扩展名:必须是.dll

              • 确认平台兼容性:如果是32位DLL,确保用32位JRE

              1. 明显配置错误提示
                • 这是因为缺少MFC相关信息:删除MFC代码
                1. 调用失败提示:“找不到函数!”
                  • 检查函数名字是否拼写正确

                  • 确保加上了extern "C"声明

                  ...

                  七、生成64位DLL

                2. 确保你安装了X64编译器
                  • 查看Visual Studio安装目录:是否有X64选项

                  • 重新安装Visual Studio时加上X64工具

                  1. 项目配置:
                  2. 选择“x64”项目平台:

                    • 右键项目,选择“属性”(Properties)

                    • 选择“尝试”菜单,点击“平台选择”

                    • 确保选择的是“x86/x64生成默认平台”

                    1. 生成:
                      • 项目-[生成]-生成(Build)

                      结果:

                      • 你的DLL将会是64位

                      八、一些高级技巧

                    2. 自动复制DLL:
                    3. 在生成过程中,设置批量复制:

                      copy /y x64\Debug\SerialPort_dll.dll ..\out\production\SerialPort.dll

                      2.ули经时间里,每次生成都会把文件复制到指定位置

                      这些优化会帮助你节省时间,避免手动复制文件

                      通过上述步骤,你可以轻松创建一个C++项目,生成正确类型的DLL文件,并在多种语言中成功调用它。在解...

    上一篇:【IntelliJ IDEA 2019.2】java log4j 最简用法及进阶用法
    下一篇:【华为Mate10】缓解手机自带存储空间压力可以转到SD的内容

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月10日 23时38分58秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章