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. Hillstone目的地址转换DNAT配置

    目的地址映射主要用于将内网的服务器对外进行发布(如http服务,ftp服务,数据库服务等),使外网用户能够通过外网地址访问需要发布的服务. 常用的DNAT映射有一对一IP映射,一对一端口映射,多对多端 ...

  2. 古韵之乞巧 题解 dp题

    [noip模拟赛1]古韵之乞巧   描述 闺女求天女,更阑意未阑. 玉庭开粉席,罗袖捧金盘. 向月穿针易,临风整线难. 不知谁得巧,明旦试相看. ——祖咏<七夕> 女子乞巧,是七夕的重头戏 ...

  3. dwr去除默认错误弹窗

    在开发中,我实在不希望dwr弹出alter,只需要打印错误日志就可以,客户端不需要alert出error或者a server error has occurred. 这样的提示,更不需要alert出堆 ...

  4. Tomcat start.bat闪退:JRE_HOME环境变量配置不对

    最近在配置Tomcat上遇到startup.bat启动闪退,在网上找了很多方法,都没解决.后来在网上找到两种问题,更改了两次,解决了.现将我遇到的问题分享,希望对遇到同样问题有帮助. 1.很多初学者对 ...

  5. inline, block, and inline-block

    总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...

  6. 百度SEO怎么做 影响百度seo排名的因素

    现在SEO的最新算法.技巧,希望大家运用这些技巧,都像我一样能够在百度上获得客户: 第一步:了解搜索引擎的工作原理爬——抓——处——排——展 第二步:大家要建立一个整体框架,影响SEO的排名有哪些因素 ...

  7. 让终端走socks5代理

    (2017.9.17更新) 方法1: 在终端中直接运行命令 1 export http_proxy=http://proxyAddress:port 这个办法的好处是简单直接,并且影响面很小(只对当前 ...

  8. EasyPR源码剖析(7):车牌判断之SVM

    前面的文章中我们主要介绍了车牌定位的相关技术,但是定位出来的相关区域可能并非是真实的车牌区域,EasyPR通过SVM支持向量机,一种机器学习算法来判定截取的图块是否是真的“车牌”,本节主要对相关的技术 ...

  9. python爬虫-上期所持仓排名数据爬取

    摘要:笔记记录爬取上期所持仓数据的过程,本次爬取使用的工具是python,使用的IDE是pycharm 一.查看网页属性,分析数据结构 在浏览器中打开上期所网页,按F12或者选择表格文字-右键-审查元 ...

  10. ArrayList 和LinkedList的区别?

    ArrayList底层使用时数组.LinkedList使用的是链表. ArrayList:  数组查询具有所有查询特定元素比较快.而插入和删除和修改比较慢(数组在内存中是一块连续的内存,如果插入或删除 ...