#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 . Это не было получено из транзитивного включения.