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. PowerScript数据类型及变量

    PowerBuilder的标准数据类型共有14种 数据类型 意    义 示    例 Blob 二进制数据 可存放可变长度的大量数据,如图片,其它类型的文档数据. 如保存位图 Boolean 布尔型 ...

  2. JSP数据库插入判断

  3. Java 数据类型与运算符

    JAVA数据类型分基本(内置)数据类型和引用数据类型. 区别: 基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上. 引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存 ...

  4. java集合类,HashMap,ArrayList

    集合类 Collection LinkedList.ArrayList.HashSet是非线程安全的, Vector是线程安全的; ArrayXxx:底层数据结构是数组,连续存放,所以查询快,增删慢. ...

  5. 4、下行短信发送WebService、下行短信发送服务 -功能详细设计 --短信平台

    3.  下行短信发送WebService 开发一个WebService,供第三方系统调用,用于发送短信.WebService接收数据后,将信息存储入数据库的短信发送数据表中. WebService参数 ...

  6. 解决Dynamic Web Module 3.1 requires Java 1.7 or newer

    需要检查和确认Eclipse项目属性的java版本和本地jdk的版本一致,以1.7版本为例: 1. 在 Java Build Path的libraries中修改对应的JDK版本为1.7: 2.在Jav ...

  7. 4-2 requests库使用

    打开自己的编辑器 创建一个py文件 这里是首先调用requests库 调用requests  最后打印出response

  8. 记录学习WeakReference发现的问题

    在学习ThreadLocal时发现ThreadLocalMap里的Entry使用到了WeakReference,所以重新学习WeakReference 查看相关博客例如: https://blog.c ...

  9. 安装ODBC前需要安装Visual C++

    https://mariadb.com/resources/blog/resolving-error-1918-system-error-code-126-when-installing-mysql- ...

  10. C# 结构体和List<T>类型数据转Json数据保存和读取

    C#  结构体和List<T>类型数据转Json数据保存和读取 一.结构体转Json public struct FaceLibrary { public string face_name ...