假设这样的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编译指示将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类与本机函数签名分开?

最佳答案

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

我要解决的方法是创建两个不同的模块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>


链接:


使用模块:http://www.swig.org/Doc3.0/SWIGDocumentation.html#Modules
命名空间支持:http://www.swig.org/Doc3.0/SWIGDocumentation.html#SWIGPlus_namespaces

关于java - Swig + Java: namespace 和包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29663453/

10-13 09:35