Имея опыт работы с C ++ и C # и небольшие знания Java, я сейчас начинаю проект Java + JNI (C ++) (Android, если это имеет значение).
У меня есть нативный метод, который создает некоторый класс C ++ и возвращает указатель на него как длинное значение Java (скажем, дескриптор). А затем другие нативные методы, вызываемые из кода Java здесь и там, используют дескриптор в качестве параметра для выполнения некоторых нативных операций с этим классом. Сторона C ++ не владеет объектом, а сторона Java, которая имеет. Но в современной архитектуре сложно определить, кому именно принадлежит объект и когда его удалять. Так что, вероятно, было бы неплохо сделать сборщик мусора Java VM, чтобы как-то управлять временем жизни объекта. Класс C ++ не потребляет никаких ресурсов, кроме некоторого фрагмента памяти, небольшого размера. Так что все нормально, если несколько таких объектов не будут разрушены.
В C # я бы, вероятно, обернул нативный дескриптор IntPtr в некоторый управляемый класс-оболочку. И переопределите свой финализатор для вызова деструктора нативного объекта, когда управляемая оболочка собирается сборщиком мусора. SafeHandle, AddMemoryPressure и т. Д. Также могут помочь здесь.
Это другая история с финализацией Java. Второе, что вы знаете после «Hello world» в Java, это то, что использование finalize - это плохо. Есть ли другие способы сделать это в Java? Может быть, с помощью PhantomReference?