Есть ли способ эффективно скопировать обернутые объекты JNI в C ++? - PullRequest
0 голосов
/ 03 января 2019

Я использую JNI Invocation API в попытке обернуть библиотеку Java в C ++.

Мои классы C ++, по сути, являются контейнерами для JNI-проектов с методами set / getter для вызова JNI и извлечения данных из указанных рабочих объектов. То, что я пытаюсь выяснить, это то, как именно я должен пытаться копировать мои экземпляры класса. Например, я хочу сделать это:

absolute_date CURRENT_DATE = DATE;

Мое решение для этого на данный момент состоит в том, чтобы иметь конструктор копирования, который работает так:

  1. Выполнение вызовов JNI для извлечения данных члена DATE.
  2. Выполнение вызовов JNI для создания нового объекта задания с полученными данными.
  3. Установите объект задания в CURRENT_DATE равным вновь созданному объекту задания

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

Копирование объекта задания было бы идеальным, однако это означает, что если DATE выйдет из области видимости, будет вызван конструктор absolute_date, который, в свою очередь, вызовет DeleteLocalRef (что делает недействительным объект задания для вновь созданного объекта).

Есть ли способ сделать то, что я хочу? То есть Можно ли создавать уникальные клоны Java-объектов в JVM через JNI, чтобы я мог иметь 2 или более уникальных ссылок на рабочие места, каждая из которых ссылается на уникальные Java-объекты, которые имеют одинаковое состояние (т.е. одинаковые значения членов и т. д.)? Я должен упомянуть, что я не могу коснуться исходного кода Java. Все это должно быть сделано через вызовы API вызова.

Если нет, то есть ли способ сделать это, используя несколько ссылок на рабочие места, т.е. если у меня есть десять копий DATE, каждая из которых имеет один и тот же проект, возможно ли каким-то образом заставить деструктор ТОЛЬКО вызвать, когда последний оставшийся DATE Объект уничтожается? Умные указатели возможно? Если так, как бы я поступил так, как я относительно новичок в этом.

Спасибо,

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