c# 调用c++ 动态链接库

1、动态链接库概述:

  • 动态链接库通常都不能直接运行,也不能接受消息;只有在其他模块调用动态链接库中的函数时,它才发挥作用。
  • Windows API中所有的函数都包含在动态链接库中。
  • 动态链接库分静态库和动态库。

2、导出函数的声明方式

1)强制用C语言方式进行修饰,且用C的默认调用约定,即__cdecl方式。这种方式编译产生的DLL中有一个导出函数:add,不加任何修饰。(这种方式最好)

extern "C" int __declspec(dllexport) add();

2)强制用C语言方式进行修饰,且用__stdcall约定。这种方式编译产生的DLL中有一个导出函数:_add@0,即前面有“_”,后面加了参数长。

extern "C" int __declspec(dllexport) __stdcall add();

3)不强制用C语言方式进行修饰,但是用__stdcall约定。这种方式编译产生的DLL中有一个导出函数:?add@@YGHXZ。这个名字很怪,后面的不好理解。

int __declspec(dllexport) __stdcall add();

4)不强制用C语言方式进行修饰,并且用 __cdecl 约定。这种方式编译产生的DLL中有一个导出函数:?add@@YAHXZ。注意看,和第三种方有一点不同。

int __declspec(dllexport) __cdecl add();

  对于DLL导出函数声明的四种写法,在动态调用时, 声明成第一种方式是最好的。但是,C/C++缺省的调用约定为__cdecl约定,如果想别的语言能用DLL的话,最好是将调用约定写成__stdcall方式(不能动态调用),然后静态(隐式)调用。
  在隐式调用时,四种声明方式都是可以的,只要调用者的声明方式和DLL声明时的方式一致即可。

pch.h 头文件

#pragma once
extern "C" _declspec(dllexport) int Sum(int a, int b);


pch.cpp 代码文件

#include "pch.h"
#include "iostream"
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int Sum(int a, int b)
{
	if (a - (int)a != 0 || b - (int)b != 0)
	{
		cout << "请输入整数" << endl;
		return -1;
	}
	return a + b;
}

extern "C"
{
	__declspec(dllexport)
		Mat* ResizeMat(Mat* mat)
	{
		Mat* result = new Mat();
		cv::resize(*mat, *result, Size(), 0.5, 0.5, INTER_AREA);
		return result;
	}
}

c#调用代码如下:

using OpenCvSharp;
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace DllTest
{
    public partial class Form1 : Form
    {
        [DllImport(@"CreateDLL.dll")]
        public static extern int Sum(int a, int b);

        [DllImport("CreateDLL.dll", EntryPoint = "ResizeMat")]
        private static extern IntPtr ResizeMatNative(IntPtr matPtr);


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int d = Sum(3, 4);
            Mat mat = new Mat("152237.jpg");
            IntPtr matPtr = mat.CvPtr;
            IntPtr resultPtr = ResizeMatNative(matPtr);
            Mat result = new Mat(resultPtr);
            result.SaveImage("output.jpg");
        }
    }
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 平台上,可以通过使用 JNI(Java Native Interface)来调用 C++ 动态链接库(DLL)。JNI 是一个 Java 虚拟机规范,用于实现 Java 代码与本地代码的交互。通过 JNI,可以在 Java 中声明本地方法,并将其实现委托给本地代码,以便在 Java 中调用本地方法。 要在 Android 中调用 C++ DLL,需要先将 DLL 编译为适用于 Android 平台的共享库(.so 文件),然后在 Java 代码中使用 JNI 调用该共享库。具体步骤如下: 1. 在 C++ 中编写动态链接库,并将其编译为适用于 Android 平台的共享库(.so 文件)。 2. 在 Java 中声明 native 方法,以便在 Java 中调用 C++ 方法。例如: ```java public class MyNativeClass { public native int myNativeMethod(int arg); } ``` 3. 在 C++ 中实现该方法,并将其封装为静态库(.a 文件)或共享库(.so 文件)。 4. 将 C++ 库与 Java 代码链接,并打包为 Android 应用程序。 5. 在 Java 代码中,使用 System.loadLibrary() 方法加载 C++ 库,并调用 native 方法。例如: ```java public class MyJavaClass { static { System.loadLibrary("MyNativeLibrary"); } public static void main(String[] args) { MyNativeClass myNativeClass = new MyNativeClass(); int result = myNativeClass.myNativeMethod(42); System.out.println("Result: " + result); } } ``` 需要注意的是,JNI 调用 C++ 方法的过程中,需要进行参数类型转换和内存管理等操作,因此需要谨慎处理。另外,由于 Android 平台涉及多种架构,需要针对不同的架构编译对应的共享库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值