Eclipse+MinGW+SWIG包装Java接口

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

#include

 

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);

    }

}

 

 

你可能感兴趣的:(其它)