这个问题与c++中的share_ptr有关,相关定义在boost_shared_ptr.i文件中。

定义如下:

// Users can provide their own SWIG_SHARED_PTR_TYPEMAPS macro before including this file to change the
// visibility of the constructor and getCPtr method if desired to public if using multiple modules.
#ifndef SWIG_SHARED_PTR_TYPEMAPS
#define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(protected, protected, CONST, TYPE)
#endif

%include <shared_ptr.i>

这一段中间的define的macro指明了getCPtr的访问级别。默认情况下是protected,所以当我们在c++中使用了引用传值时,可能会在编译到Java的时候提示getCPtr访问级别不足。

同时,源文件中也说了,用户可以提供自己的SWIG_SHARED_PTR_TYPEMAPSSWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION 来指定是否暴露getCPtr公开访问。所以如果需要公开级别的getCPtr的话,需要如下的代码

#define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(public, public, CONST, TYPE)

%include "std_shared_ptr.i"

注意,必须在引入 std_shard_ptr.i 或者 boost_shard_ptr.i 前引入(全局引入顺序都不能错),另外,不能改动TYPE,不然会引起Swig编译时找不到smartarg参数。

虽然说这样可以公开所有的getCPtr函数。但是shared_ptr默认把这个访问放到了protected应该是为了避免用户错误的在Java下操作C/C++指针。所以能不暴露的情况下还是尽量不要这么做。可以在Swig文件下定义 %shared_ptr 后定义重复定义 SWIG_JAVABODY_PROXYSWIG_JAVABODY_TYPEWRAPPER 并指定TypeName即可

%shared_ptr(Module);

SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)

SWIG_JAVABODY_PROXY(public, public, Module)
SWIG_JAVABODY_TYPEWRAPPER(public, public, public, Module)
分类: JAVA

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注