javaout typemap不适用于std :: vector of pointer

时间:2015-11-26 12:14:21

标签: java c++ java-native-interface swig

使用vector个结构,一切正常

%include <std_vector.i>

%typemap(javaout) const S1& std::vector<S1>::get {
  //custom code
}

struct S1 {};
std::vector<S1> val;

%template(vector_s1) std::vector<S1>;

但不适用于vector指针

%include <std_vector.i>

%typemap(javaout) const S1*& std::vector<S1*>::get {
  //custom code
}

struct S1 {};
std::vector<S1*> val;

%template(vector_s1) std::vector<S1*>;

使用swig -java -c++ -module sample sample.i

编译样本

SWIG版本:

$ swig -version

SWIG Version 3.0.7

Compiled with i586-mingw32msvc-g++ [i586-pc-mingw32msvc]

Configured options: +pcre

2 个答案:

答案 0 :(得分:2)

如果你查看std::vector文件swig/Lib/std/std_vector.i,它为// *** // This specialization should disappear or get simplified when // a 'const SWIGTYPE*&' can be defined // *** template<class _Tp, class _Alloc > class vector<_Tp*, _Alloc > { ... 提供了与语言无关的包装代码,你会发现以下评论:

const S1*&

因此,SWIG目前无法处理上述类型地图定义中的std::vector

现在,为std::vector<T*>提供java包装器的文件swig/Lib/java/std_vector.i要复杂得多,而且缺少std_vector_pointer.i的专业化。

自己添加这样的专业化可以解决您的问题:

档案%include <std_vector.i> namespace std { template<class T> class vector<T*> { public: typedef size_t size_type; typedef T* value_type; typedef value_type const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(T* x); %extend { T* get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && i<size) return (*self)[i]; else throw std::out_of_range("vector index out of range"); } void set(int i, T* val) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && i<size) (*self)[i] = val; else throw std::out_of_range("vector index out of range"); } } }; }

%include "std_vector_pointer.i"

%typemap(javaout) S1* std::vector<S1*>::get {
  //custom code
}

struct S1 {};
std::vector<S1*> val;

%template(vector_s1) std::vector<S1*>;

然后以下内容适用于您的上述示例:

config.h

答案 1 :(得分:0)

为什么不使用std :: shared_ptr而不是使用原始指针?

此代码应按您期望的方式工作,使用您的自定义代码&#34;替换vector_s1.java中的get函数块。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options 
from time import sleep
options = webdriver.ChromeOptions()
prefs = {"download.default_directory":  r"C:\New_Download"}
options.add_experimental_option("prefs", prefs)
print(options.experimental_options)

chromeDriverPath = r'C:\drivers\chromedriver.exe'
driver = webdriver.Chrome(chromeDriverPath,chrome_options=options)
driver.get("http://google.com")
driver.set_window_position(0, 0)
driver.set_window_size(0, 0)
相关问题