Спецификация JNI охватывает вопрос о том, кто «владеет» объектами Java, созданными в методах JNI здесь . Необходимо различать локальные и глобальные ссылки.
Когда JVM выполняет вызов JNI для собственного кода, он создает реестр для отслеживания всех объектов, созданных во время вызова. Любой объект, созданный во время собственного вызова (т. Е. Возвращенный из функции интерфейса JNI), добавляется в этот реестр. Ссылки на такие объекты известны как локальные ссылки . Когда нативный метод возвращается в JVM, все локальные ссылки, созданные во время нативного вызова метода, уничтожаются. Если вы выполняете вызовы обратно в JVM во время вызова собственного метода, локальная ссылка все еще остается активной, когда управление возвращается обратно к собственному методу. Если JVM, вызванная из собственного кода, выполняет обратный вызов в нативный код, создается новый реестр локальных ссылок и применяются те же правила.
(На самом деле, вы можете реализовать свой собственный исполняемый файл JVM (например, java.exe), используя интерфейс JNI, создав JVM (таким образом получив указатель JNIEnv *), просматривая класс, заданный в командной строке, и вызывая метод main () для него.)
Все ссылки, возвращаемые методами интерфейса JNI, являются локальными . Это означает, что в нормальных условиях вам не нужно вручную освобождать ссылки, возвращаемые методами JNI, поскольку они уничтожаются при возврате в JVM. Иногда вы все еще хотите уничтожить их «преждевременно», например, когда у вас много локальных ссылок, которые вы хотите удалить, прежде чем вернуться в JVM.
Глобальные ссылки создаются (из локальных ссылок) с помощью NewGlobalRef (). Они добавляются в специальный реестр и должны быть удалены вручную. Глобальные ссылки используются только для объекта Java, на который собственный код должен содержать ссылку на несколько вызовов JNI, например, если у вас есть события, запускающие собственный код, которые должны быть переданы обратно в Java. В этом случае код JNI должен хранить ссылку на объект Java, который должен получить событие.
Надеюсь, это немного прояснит проблему управления памятью.