SWIG引用类型

如何用SWIG封装c++接口给java使用? SWIG(Simplified Wrapper and Interface Generator)是一个将C/C++接口转换为其他语言接口的工具,从而可以讲C/C++的库集成到其他语言的系统中。目前SWIG已经可以支持Python, Java, C#,Ruby,PHP,R语言等十多种语言。3.用gcc/g++编译生成的接口代码, 以及对应语言的代码。1.编写swig的interface文件,指明接口的内容。这个Demo将cpp的代码接口转化为JAVA的代码接口。demoJNI.java , JNI的接口。 阅读详情

  SWIG也提供支持指针。SWIG存储指针使用long数据类型。通过使用fianlize函数管理与Java类相关联的c组件的生命周期。

   C++代码的封装:

  在上一部分,你浏览了C封装组件的基本。现在你将集中封装C++代码。首先,需要修改Android.mk文件来命令SWIG来产生C++代码。

  MY_SWIG_PACKAGE := com.apress.swig
  MY_SWIG_INTERFACES := Unix.i
  MY_SWIG_TYPE := cxx

 指针,引用和值

在C/C++,函数的参数有多重形式,如指针,引用或者通过简单的值。

/* By pointer. */
void drawByPointer(struct Point* p);
/* By reference */
void drawByReference(struct Point& p);
/* By value. */
void drawByValue(struct Point p);

在Java中没有这样的类型。SWIG将统一这些类型为对象实例引用,如下:

package com.apress.swig;
public class Unix implements UnixConstants {
. . .
public static void drawByPointer(Point p) {
UnixJNI.drawByPointer(Point.getCPtr(p), p);
}
public static void drawByReference(Point p) {
UnixJNI.drawByReference(Point.getCPtr(p), p);
}
public static void drawByValue(Point p) {
UnixJNI.drawByValue(Point.getCPtr(p), p);
}

默认参数

尽管默认参数,Java是不支持的,SWIG支持带有默认参数的函数通过产生对于每个默认参数的额外的函数。如下:

%module Unix
. . .
/* Function with default arguments. */
void func(int a = 1, int b = 2, int c = 3);


package com.apress.swig;
public class Unix {
. . .
public static void func(int a, int b, int c) {
UnixJNI.func__SWIG_0(a, b, c);
}
public static void func(int a, int b) {
UnixJNI.func__SWIG_1(a, b);
}
public static void func(int a) {
UnixJNI.func__SWIG_2(a);
}
public static void func() {
UnixJNI.func__SWIG_3();
}
}


函数的重载:

SWIG很容易的支持重载函数因为Java已经对他们提供了支持。重载函数被定义在接口文件中,如下:

%module Unix
. . .
/* Overloaded functions. */
void func(double d);
void func(int i);


package com.apress.swig;
public class Unix {
. . .
public static void func(double d) {
UnixJNI.func__SWIG_0(d);
}
public static void func(int i) {
UnixJNI.func__SWIG_1(i);
}
}

SWIG解决重载函数使用没有异议的模式,就是排名和排序定义依据一套类型规则。除了函数和原始的类型外,SWIG也能够支持C++的类。

. .
class A {
public:
A();
A(int value);
~A();
void print();
int value;
private:
void reset();
};

SWIG产生相应的Java类,如下。值成员变量时共有的,和其相应的getter和setter函数时有Swig自动产生的。这个reset方法并不能传递给Java,因为它被定义为私有的在类的定义中。

public class A {
private long swigCPtr;
protected boolean swigCMemOwn;
Download at http://www.pin5i.com/
121 CHAPTER 4: Auto-Generate JNI Code Using SWIG 
protected A(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
protected static long getCPtr(A obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
protected void finalize() {
delete();
}
public synchronized void delete() {
if (swigCPtr ! = 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
UnixJNI.delete_A(swigCPtr);
}
swigCPtr = 0;
}
}
public A() {
this(UnixJNI.new_A__SWIG_0(), true);
}
public A(int value) {
this(UnixJNI.new_A__SWIG_1(value), true);
}
public void print() {
UnixJNI.A_print(swigCPtr, this);
}
public void setValue(int value) {
UnixJNI.A_value_set(swigCPtr, this, value);
}
public int getValue() {
return UnixJNI.A_value_get(swigCPtr, this);
}
}




Swig超详细入门教程(Java调用C/C++, CMake)——更新于2021.12 swig官网教程:http://www.swig.org/tutorial.html swigwin下载地址:https://sourceforge.net/projects/swig/files/swigwin/ 安装后为了方便,可以添加安装目录到环境变量path。 本文主要是手把手教萌新们如何用官方用例构建(有许多本人亲身采坑血泪史) 首先我们看一个最简单的例子,如何用swig让java调用c。这里使用的是mingw和java8。 首先构建如下example.c文件 /* File : example. 阅读详情

相关推荐

VS 使用swig 教程

1. 首先在www.swig.org下载swig安装包。解压安装包到任意路径,路径中最好不要带空格。2. 制作源文件和swig接口文件,我的文件如下3. 配置Visual Studio 的文件路径,也最好把文件拷到不到空格的路径下,VS中的配置方法:VS2008: 工具-》选项-》项目和解决方案-》VC++目录里添加VS2010: 建的项目-》右击-》属性-》VC++目录 难道要每个项目都设置一遍常用的Include吗?答案是,不用找个项目的属性管理器-》Debug|Win32-》Microsoft.Cpp

welber的专栏 8038

SWIG介绍和使用

SWIG 是一种软件开发工具,可将用 C 和 C++ 编写的程序与各种高级编程语言连接起来。SWIG 与不同类型的目标语言一起使用,包括常见的脚本语言,如 Javascript、Perl、PHP、Python、Tcl 和 Ruby。支持的语言列表还包括非脚本语言,例如 C#、D、Go 语言、Java,包括 Android、Lua、OCaml、Octave、Scilab 和 R。

赶路人儿 3922

使用Swig转C++为Python详解

Swig是一个可以使得不同语言之间可以相互调用的工具,今天记录一下使用Swig将C++转为Python的方法。 首先从官网下载Swig,官网网址www.swig.org,下载后解压压缩包,并将swig.exe的路径添加到环境变量path中,就可以使用swig了。 下面我们来准备C++代码。创建一个空项目,并创建.h文件与.cpp文件,编写代码: #pragma once #include...

蹦蹦跳跳小米粒的博客 3066

Java调用C++ swig

Swig介绍 swig github SWIG (Simplified Wrapper and Interface Generator) 可以用来在多个编程语言之间进行跨语言封装接口,实现不同编程语言之间的调用。 本文是使用Swig生成Java接口调用C++编译的Linux 平台的so 首先需要安装Swig Swig安装方法 Java 调用C++ SO 主要步骤如下: 开发C++相关代码如下面example.h和example.cpp加上下面4步骤中提到的自动生成的C++ JNI文件 选择接口文件比如:e

MichaelWang的博客 2405

用swig 封装C++ 动态库的实践

python 调用C++ 有很多方案。 swig 还是比较好用的。 需求: 假设有一个现成的C++ 库 a.so 和 头文件 a.h如何通过python 来调用 a.so 里面的功能接口。 最开始我误认为必须有 a.so 的源代码cpp和a.h 才行。实践过发现,不需要源代码,swig可以根据头文件就自动生成一个可以供python调用的桥接so库的代码,在编译这个代码的时候,只要把a.so链...

shixinwenwu的专栏 3151

【SWIG】C程序到python模块的swig转换流程

C程序到python模块的转换流程 程序参考:http://www.swig.org/Doc3.0/SWIGDocumentation.html#Introduction_nn4 1、编辑待转C程序 example.c /* File : example.c */ double My_variable = 3.0; /* Compute factorial of n */ int fact(int n) { if (n <= 1) return 1; else

zhuhua造轮子的博客 667

SWIG处理引用类型的变量

最近用swig处理C接口,碰上了c中的引用及数组类型的变量,如 double &aaa, double abc[3]。可是直接用swig转之后是不行。将类型转为了SWIGTYPE_p_double。然后又仔细看了看文档,外加baidu了很多内容才明白,直接转不行,必须有swig的说明代码才可以。 如果C接口定义为 void get(double & aaa);   需要在.i文件中,加入如下代码。其中INOUT是说名这个变量既是输入也是输出。如果仅作输出可以改成OU...

yxmlhc的专栏 1149

SWIG入门 - c++ 同 c# 的混合编程

同C#的混合编程-SWIG入门 最后更新日期:2014-04-18  by kagula 环境:Windows8.1 64bits(英文版)、Visual Studio 2013 Update1(英文版)、SWIG Win 3.0.0 正文:          做小项目直接《C#调用C++写的Native DLL》工作量也能接受,但是,当接口变得很复杂这个方式就不经济。

lee353086的专栏 9222

将python文件做成接口_swig 将c++转换为python 接口

以无缝连接scanlib和python代码,我们需要通过python调用scanlib接口。1. 使用SWIG转换的c++版本的python版本scanlib痛饮和安装痛饮(简化包装器和接口生成器)是一个工具,提供脚本调用支持C \/ c++库。简而言之,它是用c \/ c++成为其他程序的接口和调用c \/ c++库通过其接口。写作痛饮是关键文件的接口文件,Python实现c++的转换。这个文件...

weixin_39928686的博客 420

使用swig将C代码转为JAVA接口的例子(Win10平台)

http://www.swig.org/download.html下载Windows 版本swigwin-4.0.2.zip,解压缩。 安装java,配置好java的环境。 配置环境变量JAVA_BIN和JAVA_INCLUDE。比如: JAVA_BIN:C:\Program Files\Java\jdk-12.0.2\bin JAVA_INCLUDE:C:\Program Files\Java\jdk-12.0.2\include

数字人生 877

swig--在java、C#中调用c++写的DLL(以vs2012配置为例)

NULL 博文链接:https://cherishlc.iteye.com/blog/1689224

Python3调用C++(使用SWIG)

本文使用的是ubuntu16.04.6, 安装python3-dev,swig sudo apt install python3-dev sudo apt install swig

爱就是是恒久忍耐的专栏 3194

从代码学习深度强化学习 - 目标导向的强化学习-HER算法 PyTorch版

经典的深度强化学习算法,如 PPO、SAC 等,在各自擅长的任务中都取得了非常好的效果。但它们通常都局限在解决单个任务上,换句话说,训练好的算法,在运行时也只能完成一个特定的任务。想象一个场景:我们想让一个机械臂能把桌子上的任何一个物体重置到任意一个指定位置。对于传统强化学习而言,如果目标物体的初始位置和目标位置每次都变化,那么这就是一个全新的任务。即便任务的“格式”——抓取并移动——是一样的,但策略本身可能需要重新训练。这显然效率极低。为了解决这类问题,

weixin_43887510的博客 1500

SWIG c# 引用 c++dll

swig 生成 cs,我就省略不说了,网上很多! 我遇到一个问题: cs文件有了,c++的dll也生成了,dll也放到BIn下面了,但是初始化对象的时候还是会报错! 找了好长时间才发现,dll拷贝到Bin下面,不代表网站加载了dll 所以要加载DLL, 1 ,  添加引用using System.Runtime.InteropServices; 2.添加 代码

u010595179的博客 626

esp32 python开发环境搭建_eclipse esp32开发环境搭建

安装方法基本是按照官网提供的方法来操作https://github.com/espressif/idf-eclipse-plugin#GettingStarted但是官网的方法安装之后还是不能编译成功的,第一次编译会出现一下问题问题1:Building in: E:\eclipse-workspace\helloworlk\buildcmake -G Ninja -DCMAKE_TOOLCHAIN...

weixin_39978276的博客 1263

YOLOv8改进002:添加小目标检测头(小目标检测大量涨点)

YOLOv8 目标检测算法改进之添加小目标检测头,亲测在小目标检测的数据集上有大幅度的涨点效果(mAP直接涨了 0.04 左右)。

m0_46496775的博客 9878

SWIG:SWIG的简介、安装、使用方法之详细攻略

SWIG的简介、安装、使用方法之详细攻略 目录 SWIG的简介 SWIG的安装 SWIG的使用方法 SWIG的简介 SWIG是一种软件开发工具,它将C和C++编写的程序与各种高级编程语言连接起来。SWIG用于不同类型的目标语言,包括常见的脚本语言,如Javascript、Perl、PHP、Python、Tcl和Ruby。支持的语言列表...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 3万+

信息安全与技术——(十一)恶意代码检测与防范技术

恶意代码(Malicious Code )或恶意软件(Malware )主要是指以危害信息的安全等不良意图为目的的程序,它们一般潜伏在受害计算机系统中实施破坏或窃取信息。

m0_63853448的博客 5991

SWIG学习记录(一)SWIG基础

SWIG 基础

Sailor431的博客 7147

知识图谱(Knowledge Graph)原理与代码实战案例讲解

知识图谱(Knowledge Graph)原理与代码实战案例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍 1.1 问题的由来

AI天才研究院 1078

UG\NX二次开发 找不到指定的dlx文件(Specified Dlx file not found)

有群友问:用Ctrl+U运行的时候就报错,找不到指定的dlx文件Specified Dlx file not found。怎么处理。

王牌飞行员_里海的博客 1130

linux环境下安装swig

下载pcre: pcre-8.41 下载swig :swig 1 安装 pcre $ tar -zxvf pcre-8.41.tar.gz $ chmod -R 777 pcre-8.41 $ cd pcre-8.41/ $ ./configure $ make $ sudo make install 2 安装swig到默认目录 $ ./configure $ make $ sudo mak...

mingo_敏 1万+

rk3588平台USB 3.0 -OAK深度相机适配方法

摘要:本文记录了OAK摄像头设备的配置与测试流程。主要内容包括:1)添加USB设备udev规则;2)拉取相关依赖库;3)安装Python3和pip;4)安装项目依赖;5)安装FFmpeg工具;6)测试摄像头功能并转换视频格式;7)将测试视频拷贝到U盘查看。操作步骤涵盖了从设备驱动配置到功能测试的完整流程,提供了详细的命令行操作指引。通过该文档可快速完成OAK摄像头的环境搭建和基础功能验证。

yy_hear的博客 325

Windows SWIG 安装与部署

SWIG在Windows上的安装与部署

m0_43605481的博客 1万+

19、CATIA V5:参数化建模与零件目录创建全解析

本文详细解析了在CATIA V5中通过设计表实现参数化建模及零件目录创建的完整流程。以支撑块和钩形夹为例,介绍了参数识别、设计表创建与关联、配置管理以及零件目录的构建方法。同时,提供了实际操作建议和注意事项,帮助设计师高效创建和管理零件族,提升设计效率和质量。

raspberrypi5的博客 449

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SWIG学习记录(三)SWIG封装C#API实例

SWIG学习记录(三)SWIG封装C#API实例

Sailor431的博客 3094

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: SWIG封装C代码
下一篇: SWIG异常处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值