精华内容
下载资源
问答
  • linux SWIG C++转换为JAVA

    2015-07-13 16:23:28
    先用C++将SDK的框架确定,再同过SWIG转换为JAVA项目

        我的这个新项目,是一个SDK,其中有虚类,要在java中,让java类可以继承。

    第一步: 

    首先需要生成.cxx文件,我的文件目录是,include(.h文件),src(.cpp文件),swig(FaceFinderModel.i文件);

            新建.i文件 

    File  "FaceFinderModel.i"
    %module(directors="1") FaceFinderModel
    %{  
    #include "IFaceFinder.h"  
    #include "IFaceFinderListener.h"
    #include "FaceFinderFactory.h"
    %}   
    %insert("runtime")
    %{
    #define SWIG_JAVA_NO_DETACH_CURRENT_THREAD
    %}
    %feature("director") IFaceFinderListener;
    %include "IFaceFinder.h"  
    %include "IFaceFinderListener.h"
    %include "FaceFinderFactory.h" 
    解释一下:

     (directors="1") 的意思是:有1个虚类,要在java中被java文件继承

     %insert ....%}  的意思是:添加一个线程安全的宏

     关键的到了  %feature("director") IFaceFinderListener; 的意思是:IFaceFinderListener 时可以被java类直接继承的

    然后   运行 $ sudo swig -c++ -java -outdir ./ -I../include FaceFinderModel.i 

    生成 一系列.java文件和1个FaceFinderModel_wrap.cxx文件和1个FaceFinderModel_wrap.h文件,这里.java文件第三步会用到。 .cxx和.h文件接下来立刻就要用到。


    第二步:

       用CodeBlock 新建一个 shared library 工程libFaceFinder07(命名有点不规范,测试用的,将就着看吧)。将你要转换的C++拷贝一份到libFaceFinder07工程中,再将第一步中生成的.h文件和.cxx文件拷贝一份复制过来,删除自动生成的main.cpp文件,再将你的C++的.h和.cpp文件拷贝进去。

       这里会用到java sdk 的jni.h ,jni_md.h,jawt_md.h文件, 在 ./jdk1.8.0_45/include/linux 文件夹下, 我是直接冲拷贝到工程下面的。

      然后,bliud项目, 这里可能会报错 

         

    /usr/bin/ld: obj/Debug/FaceFinder.o: relocation R_X86_64_32S against `_ZTV10FaceFinder' can not be used when making a shared object; recompile with -fPIC
    obj/Debug/FaceFinder.o: error adding symbols: 错误的值
    collect2: error: ld returned 1 exit status
    解决方案:

        右击项目->bliud options ... ->右侧,下方第二个选项卡“Other options”  ->输入“-fPIC” 。保存就可以了。

    再次bliud项目

     到这一步.so文件就生成了。

    第三步(检验):

       将.so copy到java.library.path 的目录下面。如果不知道,新建一个java项目 直接 system.out.println(Java.library.path),就打印出来了。

       我copy到了/usr/lib下面;

        这时候就用到了第一步时生成的.java文件了。

        新建个java工程,将第一步的.java文件全部拷贝过来。

      

    public class FaceListener extends IFaceFinderListener {
    	public void OnFaceFinded(String filename) {<pre name="code" class="java">                System.out.println("Is Finder");
    	  }
    
    	  public void OnFinished() {
    		  System.out.println("Is Finished");
    	  }
    
    	  public void OnError(int errno, String msg) {
    <pre name="code" class="java"><pre name="code" class="java">                 System.out.println("Is Error");
    
      }}
    
    
    
    
    


    public class text {
    	static {  
            System.loadLibrary("FaceFinder07");  
        }  
      
        public static void main(String argv[]){  
            FaceFinderFactory my_factory=new FaceFinderFactory();
            IFaceFinder m_FaceFinder=my_factory.CreateInstance();
            FaceListener my_FaceListener = new FaceListener();
            m_FaceFinder.SetListener(my_FaceListener);
            m_FaceFinder.Recoginze("123123",FaceFinderInputType.Image);
        }  
    }
    



    我生成的.so文件的全名是"libFaceFinder07.so",所以这里loadLibrary只需要写"FaceFinder07"就行了。

     FaceListener 就是我继承IFaceFinderListener的监听器.

    通过发送消息,C++中如果处理完了事件,就可以调用IFaceFinderListener中的OnFinished()函数,就能将C++中的事件消息,通过IFaceFInderListener传递出来,传给java函数中IFaceFinderListener的子类FaceListener中的onFInished()函数。

    大功告成,累死了

    展开全文
  • swig使用手册

    热门讨论 2013-02-25 11:47:07
    swig使用手册,swig使用必备必备
  • linux安裝swig

    2020-11-12 17:34:24
    git clone https://github.com/swig/swig.git cd swig sudo apt-get install automake ./autogen.sh ./configure sudo apt-get install ...报错,大概率是因为使用的时CentOS系统,下载时,将apt-get改为yum即可 ...

    git clone https://github.com/swig/swig.git
    cd swig
    sudo apt-get install automake
    ./autogen.sh
    ./configure
    sudo apt-get install bison flex
    make
    sudo make install

    按照上述步骤进行操作时遇到
    sudo: apt-get: command not found
    报错,大概率是因为使用的时CentOS系统,下载时,将apt-get改为yum即可

    展开全文
  • 最近研究如何封装c++给java使用,通过调研发现swig工具能很好的实现次功能。因此把本次研究的整个流程记录下来,以供大家借鉴使用

    Linux下SWIG封装c++接口供java使用

    最近研究如何封装c++给java使用,通过调研发现swig工具能很好的实现次功能。因此把本次研究的整个流程记录下来,以供大家借鉴使用。

    文件结构

    本次实验的整个文件结构如下所示

    xx@ubuntu:~/xx/swigtest$ tree .
    .
    ├── com
    │   └── test
    │       ├── DoubleVector.class
    │       ├── IntVector.class
    │       ├── StrVector.class
    │       ├── test.class
    │       └── testJNI.class
    ├── demo.class
    ├── demo.java
    ├── libtest.so
    ├── temp
    │   ├── DoubleVector.java
    │   ├── IntVector.java
    │   ├── StrVector.java
    │   ├── test.java
    │   └── testJNI.java
    ├── test.cpp
    ├── test.h
    ├── test.i
    ├── test.jar
    ├── test.o
    ├── test_wrap.cxx
    └── test_wrap.o
    
    3 directories, 20 files
    
    

    1、环境准备

    1. 安装swig
      ubuntu下可通过以下命令直接安装SWIG
    sudo apt-get install swig
    
    1. 安装javaJDK
      选择linux下x64版本deb安装包,下载后直接双击安装即可。
      https://www.oracle.com/java/technologies/javase-jdk14-downloads.html
    2. 安装javac命令
      在命令行界面输入javac后,若没有安装javac,则会提示你需要安装
      $ javac
     The program 'javac' can be found in the following packages:
     * openjdk-6-jdk
     * ecj
     * gcj-4.4-jdk
     * gcj-4.6-jdk
     * gcj-4.5-jdk
     * openjdk-7-jdk
    

    输入

    sudo apt install openjdk-7-jdk
    

    验证是否安装成功:

    javac --version
    

    2、swig封装文件准备

    新建swigtest文件夹,并在文件夹下新建test.h、test.cpp、test.i文件。同时新建temp文件夹、com/test文件夹

    1. test.h文件内容如下
    #include <string>
    #include <vector>
    int add(int a,int b);
    std::string getString();
    void setString(std::string str);
    void setStrings(std::vector<std::string>& strList);
    
    1. test.cpp文件内容如下
     #include "test.h"
    int add(int a, int b)
    {
    	return a+b;
    }
    std::string getString()
    {
    	return "Hello world!";
    }
    void setString(std::string str)
    {
    }
    void setStrings(std::vector<std::string>& strList)
    {
    }
    
    1. test.i文件内容如下
     %module test
    %{
    	#include "test.h"
    %}
    %include "std_string.i"
    %include "std_vector.i"
    %include "test.h"
    namespace std{
    
    %template(StrVector) vector<string>;
    %template(IntVector) vector<int>;
    %template(DoubleVector) vector<double>;
    }
    
    

    c++中STL与swig中对应关系如下图所示:
    在这里插入图片描述

    3、开始封装jar和so包

    1. 执行如下命令,会在当前目录下生成 test_wrap.cpp文件,在temp文件夹下生成对应的java文件
    swig3.0 -c++ -java -package com.test -outdir ./temp -o test_wrap.cpp ./test.i
    

    命令解释:
    -package 指定生成java文件的包名称
    -outdir 指定生成java文件路径
    -o 指定生成的c++对外接口文件

    1. 编译temp下所有java文件为class文件
    javac ./temp/*.java
    
    1. 移动生成的.class文件到com/test文件夹下
    mv ./temp/*.class ./com/test
    

    4.封装成jar包

     jar -cvf test.jar ./com
    

    至此jar包已经封装成功。接下来封装.so包

    1. 首先生成.o文件
     gcc -c -fPIC test.cpp test_wrap.cpp -I/usr/lib/jvm/jdk-14.0.1/include -I/usr/lib/jvm/jdk-14.0.1/include/linux
    

    注意:因为test_wrap.cpp中需要用到jni.h和jin_md.h,所以需要把其对应的路径包含进来。我的为安装jdk后的路径:
    /usr/lib/jvm/jdk-14.0.1/include
    /usr/lib/jvm/jdk-14.0.1/include/linux

    1. 连接.o文件为so动态库
    gcc -shared -o libtest.so test.o test_wrap.o
    

    4、运行demo

    1. 在swigtest下新建demo.java文件如下
    import com.test.*;
    class demo{
        static {  
            //System.load("/home/weibaox/xwb/swigtest/libtest.so");
    		System.loadLibrary("test");  //刚才生成的libtest.so动态库。
        }
    	public static void main(String argv[]){
    		int i = test.add(1,2);
    		System.out.println(i);
    		System.out.println(test.getString());
    		StrVector strvector;
    		test.setStrings(strvector);
    	}
    }
    
    1. 把libtest.so所在路径设置到环境变量,以免运行时提示找不到test库,此处设置当前路径到环境变量
     export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
    

    3.编译demo.java文件

    javac -cp ./test.jar demo.java
    

    -cp 指定demo.java依赖的jar包

    4.执行生成的demo

    java demo
    
    展开全文
  • linux使用SWIG实现Python调用C++ sdk读取相机图片 最近在弄相机的项目,算法用python 在linux使用SWIG实现Python调用C++ sdk读取相机图片,获取Mat图像,并转换成numpy。 另外,多说一句,海康之类的监控...

    linux下使用SWIG实现Python调用C++ sdk读取相机图片

    最近在弄相机的项目,算法用python 在linux下使用SWIG实现Python调用C++ sdk读取相机图片,获取Mat图像,并转换成numpy。
    另外,多说一句,海康之类的监控摄像头支持rtsp协议,opencv 可以打开rtps地址读取摄像头,所以如果只是读取图像,不需要sdk,直接opencv方便实用。

    参考了很多网上的资料:


    SWIG

    SWIG是Simplified Wrapper and Interface Generator的缩写。SWIG本质上是个代码生成器,为C/C++程序生成到其他语言的包装代码(wrapper code,为了生成这些包装代码,SWIG需要一个接口描述文件,描述将什么样的接口暴露给其他语言。SWIG可以直接接受”.h”头文件做为接口描述文件。

    一个小例子

    先写一个C++类,之后用python调用该类。

    //c++源文件
    //example.h
    #include <iostream>
    using namespace std;
    class Example{
    public:
    void say_hello();
    
    //example.cpp
    
    #include "example.h"
    
    void Example::say_hello()
    {
          printf("hello");
    }
    

    再写一个swig模块定义文件如下

    %module example
    %{
    #include "example.h"
    %}
    %include "example.h"
    

    swig -python -c++ example.i,生成example_wrap.cxx和python文件example.py。
    之后利用example_wrap.cxx和example.cpp生成一个链接库,重命名为_example.so,之后利用example.py和_example.so就可以导入example的包了。

    g++ -c -fPIC -I/usr/include/python3.5m example.cpp
    g++ -c -fPIC -I/usr/include/python3.5m example_wrap.cxx
    g++ -shared example.o example_wrap.o -o _example.so -lpython3.5m
    

    使用opencv

    在编写接口文件的时候,要将依赖的头文件都添加进来,而opencv里面的文件繁多,在Github上面有人已经写好了opencv.i

    新的.i文件

    %module example
    %include <opencv.i>
    %cv_instantiate_all_defaults
    
    %{
    #include "example.h"
    using namespace std;
    %}
    
    %include "example.h"
    

    生成example_wrap.cxx和python文件example.py

    swig -I/home/user/opencv-swig/lib/ -I/usr/local/include/ -python -c++ camera_py.i
    

    根据自己的目录改下路径,之后生成.so文件就可以了。需要注意,返回的img要通过np.asarray转换一下类型。

    cam = example.camera_py()
    img = cam.get_img()
    cv2.imshow('frame',np.asarray(img))
    

    喜欢请大打赏

    展开全文
  • 命令swig -c++ -python -o xxx_wrap.cxx xxx.i 使用.i文件生成.cxx文件与.py文件 为了编译生成可用的.so文件,我们需要xxx.cpp的xxx.o文件与xxx_wrap.cxx的xxx_wrap.o文件,使用命令: g++-fPIC -I ./ -c xxx.cpp ...
  • linux环境下安装swig

    千次阅读 热门讨论 2019-03-25 16:10:19
    下载swigswig 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 $ ...
  • 详解Linuxswig 3.0.12的手动安装过程 首先 从http://www.linuxfromscratch.org/blfs/view/cvs/general/swig.html上下载swig 3.0.12的安装压缩包, 使用tar –xvf swig3.0.1tar.gz解压压缩包 进入swig的文件夹...
  • 最近使用Linux系统进行swig的编译时遇到了一些问题,在查阅了各种资料再加上本人的摸索后终于解决了这个问题,所以在此分享一下相关经验,希望能帮到你 问题描述: /usr/bin/ld: 找不到 -lXX 以下是具体问题: /usr/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,383
精华内容 2,153
关键字:

linuxswig使用

linux 订阅