A. 新建并实现C++类库
设计这个类库的名字为SwigLib,其中需要一个Random类来生成随机数。首先在Eclipse中新建Shared Library Project:
添加Random类:
/*
* Random.h
*/
#ifndef RANDOM_H_
#define RANDOM_H_
namespace SwigLib {
class Random {
public:
Random();
int getInt(int max);
virtual ~Random();
};
} /* namespaceSwigTest */
#endif /* RANDOM_H_ */
/*
*Random.cpp
*/
#include "Random.h"
#include <stdlib.h>
#include <ctime>
namespace SwigLib {
Random::Random() {
srand((unsigned)time(0));
}
int Random::getInt(int max) {
return rand() % max;
}
Random::~Random() {
}
} /* namespaceSwigLib */
B. 使用SWIG生成Java代码
从http://www.swig.org/download.html下载swigwin-x.x.x,解压缩。
编写SWIG能识别的接口文件,这个文件将被SWIG读取并生成相应的不同语言的接口代码,在这里新建接口文件SwigLib.i:
%module SwigLib
%{
#include "Random.h"
%}
%include "Random.h"
调用SWIG命令行生成Java代码和相应的C++包装代码:
D:\Software\Develop\SWIG\swigwin-2.0.6>swig -c++ -java -packagenet.wuyf D:\wuyf\Workspace\C\SwigLib\src\SwigLib.i
C. 编译生成动态链接库
由于生成的Java代码中需要引用JNI,因此编译前必须把Java的一些include目录添加到Eclipse中去:
右键工程->Properties->C/C++General->Paths and Symbols,把%JAVA_HOME%/include和%JAVA_HOME%/include/win32路径添加到编译环境的Includes中:
在Windows的Eclipse中编译Java可以调用的链接库还需要一个非常重要的参数配置,右键工程->Properties->C/C++Build->Settings,在Tool Settings中的MinGW C++ Linker中修改Command,添加-Wl,--add-stdcall-alias选项(参考http://www.swig.org/tutorial.html):
下面,使用Eclipse编译!
D. 在Java中调用链接库
首先注意,在Windows上用MinGW生成的是32位的链接库,因此需要32位的JDK进行调用。下面将SWIG生成的Java类复制到Java工程中,注意包名保持一致,测试调用:
package net.wuyf;
importorg.testng.Assert;
importorg.testng.annotations.BeforeClass;
importorg.testng.annotations.Test;
public classRandomTest {
privateRandom r = null;
privatestatic int maxInt = 100;
static{
System.load("D:\\wuyf\\Workspace\\C\\SwigLib\\Debug\\libSwigLib.dll");
}
@BeforeClass
publicvoid beforeClass() {
r = newRandom();
}
@Test(threadPoolSize= 1, invocationCount = 100)
publicvoid getInt() {
inti = r.getInt(maxInt);
Assert.assertTrue(i>= 0 && i < maxInt);
System.out.println(i);
}
}