Передача адреса объекта в JNI и метод JNI должны заполнять поля этого переданного объекта - PullRequest
0 голосов
/ 22 февраля 2011

Я хотел бы передать адрес Java-объекта, а метод JNI должен заполнить поля передаваемого объекта. 1. Java-код передает заданную ссылку на объект. Метод JNI должен иметь возможность кэшировать этот объект. Это одноразовый звонок. 2. Затем объект java повторно вызывает метод native-работы с различными аргументами, и JNI должен иметь возможность каждый раз заполнять поля кэшируемого объекта. Он не возвращает ничего, кроме void, хотя он заполняет тот же кешированный объект. 3. Java после вызова нативных методов #work использует одну и ту же ссылку на объект (передается во время init) каждый раз и получает обновленные поля ссылочного объекта. 4. Метод works часто вызывается (более одного раза) в секунду.

Обсудите дизайн, риски и т. Д., И любые предложения высоко оценены. Примечание: Меньше акцента на неиспользовании JNI, там уже много потоков. Чем важнее данный JNI, тем больше риск сбора мусора, какой тип ссылки использовать (глобальный, слабый) и является ли этот проект хорошим / плохим и как его можно улучшить и т. Д.?

Ожидается больше ответов

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Используя ваш текущий дизайн:

  1. Используйте env->NewGlobalRef, чтобы получить постоянную ссылку на объект.Используйте env->GetObjectClass, чтобы получить идентификатор класса.Используйте env->GetFieldID для получения идентификаторов полей, кешируйте их.

  2. Используйте env->Set<Type>Field, используя ссылку на объект и запомненные идентификаторы полей.

Iсоветую передавать объект при каждом вызове, от кеширования ссылки выиграть нечего.

2 голосов
/ 22 февраля 2011

Вы бы выиграли, кэшируя поиск по полю и метаданные класса.

Не уверен, что вы бы много выиграли с точки зрения производительности, кэшируя сам объект.Но вы можете сделать это, если хотите.ИМХО, было бы чище проходить объект каждый раз.

У меня похожая структура и метод вызывается более 100K раз в секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...