совместное использование памяти с c ++ и JNI - PullRequest
3 голосов
/ 02 декабря 2011

Я пишу оболочку на Java для программы на C ++. Обертка делается с помощью SWIG. У меня есть следующая проблема: когда я вызываю функцию из Java, которая создает большой объект в C ++, Java «не видит», что она выделила много памяти, так как она не выделена в куче Java. Проблема в том, что сборщик мусора не вызывается при удалении объекта, так как со стороны Java имеется много свободной памяти. Я попытался реализовать то, что описано здесь: http://www.swig.org/Doc1.3/Java.html#java_heap_allocations. Идея состоит в том, чтобы выделить пространство памяти для C ++ в куче Java. Поскольку мне не интересно использовать это для каждого new, я переименовал new и delete и использую их явно из моего кода C ++, где это необходимо.

Этот механизм, кажется, работает (я вижу, что куча Java растет и уменьшается сборщиком мусора), но, к сожалению, у меня случайный сбой, который, кажется, происходит во время memcpy.

Если я вызываю сборщик мусора вручную, моя программа работает, но это не очень чистый метод.

Спасибо за любую подсказку.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

На самом деле я не заметил следующую строку на веб-сайте swig:

Если вы собираетесь использовать оптимизации, включенные с помощью gcc (например, -O2), убедитесь, что вы также компилируете с -fno-строго-псевдонимы

Кажется, это решило проблему

1 голос
/ 07 июля 2013

Не могли бы вы просто вручную вызвать деструктор объекта C ++ через SWIG? Кажется, это работает для меня.

...