swig是一个生成其他高级语言调用c和C++代码的工具,比如,大家都知道java的jni,可能没写过,因为非常麻烦,swig可以帮助生成这样的代码,编译生成的代码后,它会生成java类和c代码文件。分别编译后,就可以在java中调用c++的库了。

swig非常强大,建议每个程序员都学会它。

swig支持十几种编程语言,包括java,c#,javascript,python等,常见的编程语言都被支持了。

官方基础入门教程:

http://www.swig.org/tutorial.html

看lazy的部分,直接include c++的头文件。一般情况下,是不会自己动手写interface的。

当包含了C++的头文件之后,要使用 -c++,否则无法正确生成代码。

如:

swig -c++ -csharp example.i

1.如何忽略某些方法

有些c和c++的代码,只写了函数声明,但是没有函数的实现,而swig生成的代码会调用这些方法,所以Link的时候会找不到符号。

这种情况,用%ignore

%ignore a::somemethod;

%include xxx.h

会忽略所有名字为a::somemethod的方法。但注意,ignore要放在被包含的头文件解析之前。也就是在%xxx.h前面

2.如何生成namespace

默认情况下,所有的生成的类和结构体,枚举都没有namespace,即使c++代码里面声明了namespace

假如有个c++类叫 MyNameSpace::MyClass

%nspace MyNameSpace::MyClass;//注意行结束要有分号

就可以生成带有namespace的代码了。缺点是每个类都要声明一次。

如果想在所有代码的前面都将上一个namespace,可以这样使用命令行

swig -c++ -csharp -namespace NsPrefix example.i

这样生成的类叫 NsPrefix.MyNameSpace.MyClass

3. DllImport指定Dll名称

可以在使用命令行的时候,加上 -dllimport <name>

补充2个问题,如何映射指针

swig对于指针,默认是不做转换的,它只会把这个类型看作是“某个对象的指针”,比如,char* ,它会生成一个叫SWIGTYPE_p_char的类型,还保存这个指针。语法上是没问题,实际却很难使用,可以说基本没有实用价值。这种情况,要做TypeMap,具体我也研究的不深,只是解决了几个自己用到的问题。

1.原生类型的数组

比如,原来的函数声明是:

void MyFunction(int* data, int length);

%include <arrays_csharp.i>;//这是一个Swig定义好的TypeMap
%apply int FIXED[] {int * data}//data是要作用的参数名
%csmethodmodifiers MyFunction "public unsafe";//如果不加这句,生成的C#函数会因为缺少unsafe而出错,因为它生成的代码是使用fixed,需要unsafe上下文

2.对于stl的类

比如,std::string,希望它映射为c#的string,否则没法处理

这个swig也预定义了TypeMap,只要

%include <stl.i>

就可以了。

3.字符数组 char**

这个希望把它映射为C#的string[],否则没法调用它,这种情况就要自定义TypeMap

CSHARP_ARRAYS(char *, string)
%typemap(imtype, inattributes="[System.Runtime.InteropServices.In,System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPArray, SizeParamIndex=0, ArraySubType=System.Runtime.InteropServices.UnmanagedType.LPStr)]") char *INPUT[] "string[]"
%apply char *INPUT[] { char * shaderStrings[] }//例子1
%apply char *INPUT[] { char ** s }//例子2,与例1不同,char**和char* []是不同类型,如果写错了会不起作用

最强大的跨语言调用生成工具:Swig 快速实用教程的更多相关文章

  1. Golang通过Thrift框架完美实现跨语言调用

    每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...

  2. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  3. vs2019 Com组件初探-简单的COM编写以及实现跨语言调用

    前提条件 1.掌握C++基础语法 2.平台安装 vs2019 3.本地平台为 windows 10 1909 X64 4.了解vbs基础语法 本次目标 1.掌握Com组件的概念及原理 2.编写一个简单 ...

  4. 跨语言调用Hangfire定时作业服务

    跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...

  5. C++ 跨语言调用 Java

    C++ 跨语言调用 Java Java JDK 提供了 JNI 接口供 C/C++ 程序调用 Java 编译后的类与方法,主要依赖于头文件(jni.h) 和 动态库(jvm.so/jvm.dll),由 ...

  6. 使用thrift进行跨语言调用(php c# java)

    使用thrift进行跨语言调用(php c# java)   1:前言 实际上本文说的是跨进程的异构语言调用,举个简单的例子就是利用PHP写的代码去调C#或是java写的服务端.其实除了本文提供的办法 ...

  7. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  8. Java跨语言调用,使用JNA访问Java外部接口

    1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...

  9. CLS(公共语言规范)的CLSCompliant(跨语言调用)

    .net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:用C#写的一个类,编译到dll中,然后在VB.net中调用: using System;namespace  ...

随机推荐

  1. IDEA中常用的maven指令

    Maven库: http://repo2.maven.org/maven2/ Maven依赖查询: http://mvnrepository.com/ Maven常用命令:  1. 创建Maven的普 ...

  2. 48-设置tomcat虚拟路径的两种方法(Eclipse、tomcat、IDEA)

    设置tomcat虚拟路径的两种方法(Eclipse.tomcat.IDEA) 三种方式设置虚拟服务器路径如果我们要实现一个上传文件的功能,但是又想要上传的文件不会随着自己web服务器的重启而不能访问了 ...

  3. 开发模型之V模型

    1.模型目的: V模型的目的在于改进软件开发的效率和效果. 2.常见理论性描述:  V模型从整体上看起来,就是一个V字型的结构,由左右两边组成. 左边的下划线分别代表了需求分析.概要设计.详细设计.编 ...

  4. C#导入c++ dll报找不到dll文件 masm32调用c++类库

    最近需要在C#下调用一个c++ dll库,不管怎样dllimport就是报错找不到该dll文件,路径.函数名称.参数.dllimport参数逐个检查确认无误也无济于事,无奈想用其他语言调用试试,由于是 ...

  5. optional的使用

    :first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...

  6. CentOS 7 建立svn仓库 远程连接

    首先安装svn (后补) mikdir /usr/local/svn_repertory  # 创建svn大仓库用于存放所有项目代码 cd  /usr/local/svn_repertory  # 进 ...

  7. NC 创建表空间数据库

    1.首先创建表空间 CREATE SMALLFILE TABLESPACE "NNC_DATA01" LOGGING DATAFILE 'D:\NCOracle\nc633sd\N ...

  8. windows任务栏IDEA图标变白色快速解决方法

    方案1:同时按Windows键+R键打开运行对话框,输入ie4uinit.exe -show然后回车即可修复. 方案2:打开计算机(Win7),此电脑(Win10)或任意文件夹,然后在地址栏输入cmd ...

  9. 利用WMITool解决Windows10 浏览器主页被hao123劫持问题

    利用Windows10 激活工具KMS10_1025激活系统之后会出现首页 被劫持的问题 解决办法如下 1.下载wmi tool 连接地址 链接: https://pan.baidu.com/s/1g ...

  10. 文件操作命令(replace)

    Replace 命令: // 描述: 替换文件. // 语法: REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W ...