JNI: Как обработать создание / удаление обернутого объекта C ++ - PullRequest
4 голосов
/ 14 января 2011

Я хотел бы обернуть объект C ++, чтобы я мог получить к нему доступ из Java. Я понял, как сохранить ссылку на мой объект C ++ в классе Java-оболочки, читая jni и используя новые объекты c ++ в java . Однако я не понял, как справиться с созданием и удалением моего объекта C ++. Конечно, я могу представить нативные методы, которые создают и удаляют мой объект C ++, но это означает, что я должен сам позаботиться об управлении памятью на Java ... не очень Javaish. Есть ли какие-то собственные методы, которые я должен реализовать, которые вызываются при создании объекта-оболочки Java и сборке мусора?

1 Ответ

7 голосов
/ 14 января 2011

Вы должны написать собственные методы для создания и уничтожения вашего объекта c ++.Есть 3 различных способа, которыми я знаю, как вы могли бы вызывать тех, у кого есть Java.

  • Реализуйте метод public void finalize() для вашего объекта Java.Сборщик мусора вызовет этот метод, как только ваш объект будет завершен, чтобы вы могли разместить здесь вызов метода destroy, и сборщик мусора позаботится обо всем.У finalize () есть свои недостатки, он замедляет сборщик мусора и будет вызываться из другого потока, чтобы назвать несколько.

  • напишите метод dispose () и управляйте своей памятью вручную.Это используется Swing / AWT для собственных ресурсов.Это дает вам контроль над тем, когда и где удаляется объект c ++.Вы все еще можете реализовать finalize () для остановки утечек памяти / отладки вашего кода.

  • Используйте класс PhantomReference и ReferenceQueue , чтобы проверить,один из ваших объектов был собран мусором и удалил оттуда объект c ++.Это обеспечивает альтернативу finalize ().

...