这个问题与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_TYPEMAPS
和 SWIG_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_PROXY
和 SWIG_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)
%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)
声明:
本文采用
BY-NC-SA
协议进行授权,如无注明均为原创,转载请注明转自
云曦的秘密基地
本文地址: Swig编译Java后getCPtr修饰符问题(protected)
本文地址: Swig编译Java后getCPtr修饰符问题(protected)