假设这样的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/