linux SWIG C++转换为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()函数。

大功告成,累死了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值