最强大的跨语言调用生成工具:Swig 快速实用教程
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 快速实用教程的更多相关文章
- Golang通过Thrift框架完美实现跨语言调用
每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...
- Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用
目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...
- vs2019 Com组件初探-简单的COM编写以及实现跨语言调用
前提条件 1.掌握C++基础语法 2.平台安装 vs2019 3.本地平台为 windows 10 1909 X64 4.了解vbs基础语法 本次目标 1.掌握Com组件的概念及原理 2.编写一个简单 ...
- 跨语言调用Hangfire定时作业服务
跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...
- C++ 跨语言调用 Java
C++ 跨语言调用 Java Java JDK 提供了 JNI 接口供 C/C++ 程序调用 Java 编译后的类与方法,主要依赖于头文件(jni.h) 和 动态库(jvm.so/jvm.dll),由 ...
- 使用thrift进行跨语言调用(php c# java)
使用thrift进行跨语言调用(php c# java) 1:前言 实际上本文说的是跨进程的异构语言调用,举个简单的例子就是利用PHP写的代码去调C#或是java写的服务端.其实除了本文提供的办法 ...
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...
- Java跨语言调用,使用JNA访问Java外部接口
1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...
- CLS(公共语言规范)的CLSCompliant(跨语言调用)
.net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:用C#写的一个类,编译到dll中,然后在VB.net中调用: using System;namespace ...
随机推荐
- 10.17 elemen.js
今天终于把element.js的官方文档看完了,主要是基础组件的用法,看的时候有种之前学bootstrap的感觉,似曾相识. 虽然它是基于VUE的,但是展示给我们的代码已经精简到不用会VUE也能看懂了 ...
- python3 电脑说话
#coding:utf-8 import win32com.client spk = win32com.client.Dispatch("SAPI.SpVoice") spk.Sp ...
- MUI 添加自定义图标(注意点)
参考: https://blog.csdn.net/qq_39759115/article/details/79436606 注意: 1. 将这个原来的逗号改成分号 2. 这些图标的名字都可以改名字
- bootstrap-table 踩坑手记
官方文档: http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/ 渲染表格有两种方法: 1)data属性渲染表格 2)js代码渲染表 ...
- [Python] 建 Django 项目
Python和Django的安装见这里:http://www.runoob.com/django/django-install.html 安装 Django 之后,您现在应该已经有了可用的管理工具 d ...
- canvas简易画板。
在学canvas的时候,想到可以做一个自己用来画画的简易画板,加上canvas的基础都已经学完,便尝试做了一个画板.如图 1.获取标签. var c=document.getElementById(' ...
- Web性能和负载测试工具补充
压力测试文档:https://yq.aliyun.com/articles/377543https://www.cnblogs.com/ahjxxy/archive/2012/09/17/268899 ...
- .gitignore语法
没嘛用 “#”表示注释 “!”表示取消忽略 空行不作匹配 若匹配语句中无“/ ” ,便将其视为一个 glob匹配,如'abc'可以匹配 ' abc' , 'cd/abc' , 'ef/abcde.tx ...
- 通过PRINT过程制作报表
通过PRINT过程制作报表 PRINT过程是SAS中用于输出数据集内容的最简单常用的过程,它可将选择的观测和字段以简单的矩形表格形式输出. 1.1 制作简单报表 使用PRINT过程最简单的语法形式如下 ...
- JDK工具 javap
javap -c [ClassName] 编译为汇编语言