Swig + Java:名称空间和包

时间:2015-04-16 00:46:28

标签: java c++ namespaces packages swig

假设C ++类结构如下:

namespace MainNS
{
    namespace A
    {
        class Class
        {
            //...
        };
    }

    namespace B
    {
        class Class
        {
            //...
        };
    }

    //...
}

我已按照此SWIG文档:http://www.swig.org/Doc3.0/Java.html#Java_namespaces

在接口文件中,我定义了以下内容以在Java端创建包:

%nspace MainNS::A::Class
%nspace MainNS::B::Class

然后必须使用java pragma将JNI文件放入“适当的”位置(类可以访问它的地方 - 这是问题的核心,请参见下文):

%pragma(java) jniclasspackage = "MainNS::A" //or "MainNS::B"

现在,来自班级MainNS::A::Class(包MainNS.A)的所有人都可以访问生成的<modulename>JNI班级。

但是,名称空间B最终位于不同的包MainNS::B中,而MainNS::B::Class(包MainNS.B)无法访问<modulename>JNI类。

这个问题的解决方案是什么?据我所知,没有SWIG选项将生成的JNI类与本机函数签名分开?

1 个答案:

答案 0 :(得分:0)

这是一个很老的话题,但是由于我遇到了类似的问题:

我要解决的方法是创建两个不同的模块A和B(以及两个不同的Swig接口文件A.i和B.i)。您可以导入每个文件(使用%import而不是%include)

%module A 
%{
    #include <MainNS/A.hxx>
%}
%feature(nspace);
%pragma(java) jniclasspackage="MainNS.A";

%import "B.i"
%include <MainNS/A.hxx>

然后B.i:

%module B 
%{
    #include <MainNS/B.hxx>
%}
%feature(nspace);
%pragma(java) jniclasspackage="MainNS.B";

%import "A.i"
%include <MainNS/B.hxx>

链接: