SWIG не принимает обернутые объекты для параметров указателя

#java #c #pointers #swig

#java #c #указатели #swig

Вопрос:

Я пытаюсь использовать SWIG для переноса некоторого кода C для Java. У меня есть класс C ( BitVector ), который SWIG переносит просто отлично.

Моя проблема в том, что у меня также есть метод в другом классе, который принимает параметр типа const BitVectoramp; ranges , но SWIG переносит этот параметр как SWIGTYPE_p_BitVector .

Я получаю два разных файла-оболочки SWIG: a BitVector.java и a SWIGTYPE_p_BitVector.java . Когда я перехожу к вызову метода из Java (на самом деле Scala) и представляю BitVector объект, мой компилятор Scala жалуется, что я передаю a BitVector туда, куда он хочет SWIGTYPE_p_BitVector .

Предполагается ли, что SWIG автоматически создает код, позволяющий мне передавать обернутый объект, когда ожидается постоянная ссылка или указатель? Есть ли какая-то карта типов, которую я мог бы создать, чтобы извлечь BitVector.swigCPtr поле?

Все, что я могу найти в Google, — это инструкции о том, как обращаться со случаем указателей на примитивные типы. typemaps.i Для этого есть карты типов, которые позволяют передавать, например, Java int , когда базовая функция C хочет int* и только собирается ее прочитать, но я не могу найти ничего подобного для типов оболочек, созданных SWIG.

Комментарии:

1. Короткий ответ: да, SWIG обычно справляется с этим просто отлично, он не должен создавать отдельный класс для ссылочной версии const. Возможно, что-то не так с файлом .i, не могли бы вы опубликовать часть файла .i, которая показывает определения includes и bitvector? Пробовали ли вы некоторые из тестовых файлов, поставляемых с SWIG, простейшие примеры покажут, что это должно работать и должно нормально компилироваться.

Ответ №1:

Итак, я думаю, что я решил это. Да, предполагается, что SWIG позволяет передавать обернутый класс функции, ожидающей ссылку или указатель на такой класс. Оказывается, проблема, с которой я столкнулся здесь, была проблемой с пространством имен.

BitVector на самом деле определяется как CSA::BitVector , и получает using ‘d по файлу, в котором находится метод, принимающий a const BitVectoramp; . Эта using директива не попала в мой SWIG-файл, поэтому SWIG подумал BitVector , CSA::BitVector что это два разных типа, и обернул их оба.

Я решил проблему, включив using CSA::BitVector в файл .i . Это не было получено из транзитивного включения.