linux SWIG C++转换为JAVA
来源:互联网 发布:gps端口修改器 编辑:程序博客网 时间:2024/06/15 13:17
我的这个新项目,是一个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 -fPICobj/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()函数。
大功告成,累死了
- linux SWIG C++转换为JAVA
- 利用 SWIG 转换 C/C++ 接口到 Java 接口
- java/android 使用swig编译c/c++ 代码类型转换
- linux下使用SWIG将C/C++库移植到Java
- SWIG and Python(用SWIG将C/C++封装为Python扩展模块)
- 使用swig为python添加c扩展总结
- 使用Swig为Python程序添加C扩展
- 利用SWIG转换C++接口到Java接口
- SWIG c++ -> java 转换byte[] 的关键代码
- 我使用过的Linux命令之swig - 把C/C++的代码嵌入Java等语言的开发工具
- Swig编译C代码供java调用实例
- 用Swig将c/c++程序转为java代码(使用swig实现java调用c、c++的方法)
- swig+crf++0.58+java环境配置详解(win+linux)
- swig c python
- SWIG封装C代码
- 脚本c接口swig
- Python与C++,SWIG
- Swig将C++编译lib项目转换为C#可引用的dll[勘误后]
- 实现iphone风格的对话框
- unity IOS xml序列化真机运行JIT问题
- pthread_create()
- addStretch 布局平均分配空间
- 如何提高程序效率
- linux SWIG C++转换为JAVA
- 图像相似度算法--SIFT算法详解
- static类型指针使用中的问题(AVPicture 类型内存释放)
- Double-Buffer双缓冲——游戏编程模式(下)
- Leetcode47: Palindrome Linked List
- 模拟登陆
- Android PullToRefresh 实战(ListView)
- genymotion报出unable to connect to virtual device的解决方法
- Android网络编程之Http请求服务器数据(GET方式)