java使用swig调用链接库
1、i文件编辑,直接将头文件包含进来即可
/* File : xxx.i */
%module xxx
%{
#include "test.h"
%}
%include "test.h"
2、生成cxx文件。如果链接库是c的,-c++可以省略。
swig -c++ -java -package com.test -outdir ./ -I../include xxx.i
3、编译cxx文件
windows的建议采用vc编译,linux采用codeblocks。
4、vc编译如下:
1)、在vc6中建立新的dll工程,建立一个空白的cpp文件,将swig生成的cxx文件内容拷贝进去;
2)、把依赖的头文件拷贝到工程根目录,也就是和上面cpp一个位置;
3)、jni.h和jni_md.h是项目依赖的,需要将它们拷贝到vc6的VC98\Include文件夹;
4)、在根目录下建立一个文件夹,将需要依赖的lib文件放进去,然后在工程--设置--连接选项卡中的“对象/库模块”中加入
lib/xxx.lib,每加一个都有空格;
5)、至此就可以调试了,调试过程中发现的代码错误可以修改;
6)、在菜单栏空白处右键选组件,出现的新工具可以切换debug和release方式。
5、codeblocks编译问题。
1)、解决code::blocks 不能编译问题:
Go to the left panel that says projects, and right-click on .cpp file. Select properties, then go to build. Check the boxes under the heading Belongs in Targets: "Debug" and "Release"
2)、不让编译时输出“dereferencing type-punned pointer will break strict-aliasing rules”方法
凡gcc/g++地方 都改
gcc -Wno-strict-aliasing
g++ -Wno-strict-aliasing
6、swig参数说明:
1)-c++ -java
告诉swig将C++接口转换为java接口。如果是将C接口转换为java接口,就不需要-c++,直接写 swig -java就可以。
2)-package
生成的java类的包的名称
3) -I
xxx.i中include的.h文件的路径
4)xxx.i
swig的.i文件
执行这条命令后,将在swig路径下生成几个文件
1)test_wrap.cxx
C++文件,包装器文件。它将C++类的方法转换为C的函数。
2)test.java
这是与刚才定义的module同名的一个类。
3)testJNI.java
打开这个文件可以看到,C++类的方法都转化为Java的静态方法。
4)其他与C++类同名的Java类
每一个C++类都被转化为与之对应的Java类,并且类名,方法明完全一样。