如何用SWIG封装c++接口给java使用?

SWIG是什么?

SWIG(Simplified Wrapper and Interface Generator)是一个将C/C++接口转换为其他语言接口的工具,从而可以讲C/C++的库集成到其他语言的系统中。目前SWIG已经可以支持Python, Java, C#,Ruby,PHP,R语言等十多种语言。

官方网址:

Simplified Wrapper and Interface Generatorhttps://www.swig.org/

SWIG对c/c++语言特性的支持:

ISO C99全部特性, ISO C++ 从98到11 , 14, 17。 暂时还不支持C++20的特性

SWIG支持生成的语言:

  • C#
  • D
  • Go
  • Guile
  • Java
  • Javascript
  • Lua
  • MzScheme/Racket
  • OCaml
  • Octave
  • Perl
  • PHP
  • Python
  • R
  • Ruby
  • Scilab
  • Tcl

支持的平台

Unix,windows,Mac都支持。

SWIG如何使用?

1.编写swig的interface文件,指明接口的内容

2.用swig程序生成对应的接口代码

3.用gcc/g++编译生成的接口代码, 以及对应语言的代码

4.对目标语言调用接口

下面我给结合Demo.

这个Demo将cpp的代码接口转化为JAVA的代码接口。

cpp代码:

apple.h

cpp 复制代码
#ifndef __APPLE_H__
#define __APPLE_H__


enum class LogLevel {
    Trace  /// Most detailed output
    ,Debug
    ,Info
    ,Warn
    ,Error
    ,Fatal  /// Least detailed output
    ,Current  /// no-op, value indicates current level should be retained
};


class Apple
{
public:
    Apple();
    int GetColor(void);
    void SetColor(int color);
    
private:
    int m_nColor;
};
#endif 

apple.cpp

cpp 复制代码
#include "apple.h"

Apple::Apple() : m_nColor(0)
{
}
 
void Apple::SetColor(int color)
{
    m_nColor = color;
}
 
int Apple::GetColor(void)
{
    return m_nColor;
}

SWIG接口文件 apple.i

cpp 复制代码
%module demo
%{
/* Includes the header in the wrapper code */
#include "apple.h"
%}

/* Parse the header file to generate wrappers */
%include "apple.h"

用SWIG生成代码

bash 复制代码
swig -java -c++ apple.i

swig会生成好几个文件:

demo.java, module名称

Apple.java, 类的实现

apple_wrap.cxx , c++的接口

demoJNI.java , JNI的接口

编译C++的接口

bash 复制代码
g++ -fpic -shared apple_wrap.cxx  -o libapple_java.so   apple.o  \
-I/usr/lib/jvm/default-java/include \
-I/usr/lib/jvm/default-java/include/linux

编写测试代码main.java

java 复制代码
public class main {
  public static void main(String argv[]) {
    System.loadLibrary("apple_java");
    
    Apple a = new Apple();
    a.SetColor(1);
    System.out.println(a.GetColor());

  }
}

编译运行java代码

bash 复制代码
javac main.java
java -Djava.library.path=.  main

OK,运行成功了。

相关推荐
陌路201 分钟前
C23构造函数与析构函数
开发语言·c++
_OP_CHEN31 分钟前
C++进阶:(二)多态的深度解析
开发语言·c++·多态·抽象类·虚函数·多态的底层原理·多态面试题
CsharpDev-奶豆哥34 分钟前
JavaScript性能优化实战大纲
开发语言·javascript·性能优化
小妖同学学AI1 小时前
Rust 深度解析:变量、可变性与所有权的“安全边界”
开发语言·安全·rust
2301_764441331 小时前
基于python构建的低温胁迫实验
开发语言·python
ICT系统集成阿祥1 小时前
华为CloudEngine系列交换机堆叠如何配置,附视频
开发语言·华为·php
wjs20241 小时前
C++ 基本语法
开发语言
金色熊族2 小时前
装饰器模式(c++版)
开发语言·c++·设计模式·装饰器模式
七夜zippoe2 小时前
仓颉语言核心特性深度解析——现代编程范式的集大成者
开发语言·后端·鸿蒙·鸿蒙系统·仓颉
四谎真好看2 小时前
Java 黑马程序员学习笔记(进阶篇21)
java·开发语言·笔记·学习·学习笔记