2014-07-21 5 views
1

Вдумайтесь в вызов java-объектов, как предотвратить java от изменения местоположения объекта? В C++ один запрашивает JVM для ссылки на объект an, а затем вы выводите его на указатель. Таким образом, проблема очевидна, ваш указатель уже недействителен. Есть идеи?Предотвращение переадресации объекта Java

Рассматривая ответы до сих пор, позвольте мне уточнить. Насколько я понимаю, когда java создает объект, он предоставляет ссылку (эквивалентную указателю), и эта ссылка приводит все другие объекты к ее фактическим данным и методам. При вызове java из C++ вы должны вводить ссылку на указатель и, таким образом, у вас есть местоположение в памяти объекта.

Java поддерживает пулы памяти как можно чище, чтобы оптимизировать фрагментацию выполнения/кучи и т. Д. При этом он может очень хорошо перемещать объекты в разные пулы памяти, тем самым изменяя фактический адрес памяти на опорные точки (внутренне, в jvm) и обновляет список ссылок, так что все остальные объекты Java могут по-прежнему обращаться к тем же объектам правильно.

Мой вопрос доходит до того, что в C++, поскольку они не являются контрактом между исполняемой средой C++ и JVM, вы передаете ссылку на указатель, который теперь указывает на физический адрес в памяти. Если JVM перемещает объект в процессе оптимизации, будет ли этот указатель на C++ теперь некорректным в долгосрочной перспективе java-программы?

Надеюсь, это поможет прояснить вопрос.

+0

"Изменение местоположения"? Что это значит? В Java нет указателей, таких как C/C++. Ссылки относятся к объектам, живущим на вашей куче, нигде больше. – duffymo

+0

Является ли ваш вопрос о том, как Java может перемещать объекты, а C++ не может, или как, если вы используете JNI для взаимодействия с JVM, указатели, которые вы используете, не заканчиваются плохо? – templatetypedef

+0

См. Также http: // stackoverflow.com/questions/8764683/is-it-possible-to-find-the-address-of-a-non-primitive-variable-in-java – Raedwald

ответ

1

Вы, , должны выглядеть, чтобы узнать о методах JNI. Предполагая, что это так, JVM «выдает» объект аргумента JNI или объект, созданный JNI-методом, по одному и тому же адресу в течение всего метода. Если вы хотите сохранить ссылку на объект JNI между вызовами JNI и чтобы он был действительным во время следующего вызова, вы должны использовать GlobalRef.

EDIT Я ответил на ваш вопрос, как редактируется, но это:

В C++ один спрашивает JVM для ссылки на объект то приведение его к указателю.

не является правильным, и ни это:

При вызове Java внутри C++ вы должны ввести отбрасывать ссылку на указатель и, таким образом, у вас есть место, в памяти объекта

или это:

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

У вас никогда не было адреса объекта в JNI. У вас есть непрозрачное значение, предоставленное JVM как jobject.. То, что оно содержит, полностью неопределено, и никакой механизм типа для получения адреса памяти не указывается нигде в спецификации JNI.

+0

Возможно, мое невежество в этом вопросе мешает мне понять ваш ответ. Насколько я понимаю, JNI используется Java для вызова внешних библиотек/функций, написанных на других языках, кроме java. Я, с другой стороны, пытаюсь определить жизнеспособность/целесообразность вызова java friom внутри C++. – FlyingGuy

+0

Неправильно. Вызов Java из C++ по-прежнему JNI. – EJP

+0

@EJP «JVM« выдает »объект аргумента JNI или объект, созданный методом JNI, к тому же адресу в течение всего метода.» - Это абсолютно неправильно, когда речь идет о HotSpot JVM. Как я уже говорил ранее, HotSpot не поддерживает привязку объектов. Вместо этого он обновляет дескрипторы jobject, когда соответствующий объект перемещается GC. – apangin

Смежные вопросы