|
|
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Привет всем, Возникла потребность реализовать в Java интерфейсные native -функции со сторонней C++ библиотекой. Вся беда в том, что многие функции в этой библиотеке возвращают значения через свои REF-параметры. А как их передать обратно в native-функцию Java пока никак не придумаю. С Java дружу не так давно, опыта мало, и на ум приходит, пока, только одно решение: создать некий промежуточный класс с описанием внутренних полей-параметров, количество которых будет совпадать с количеством REF-параметров в c++ функции, и передавать такой объект в качестве одного из параметров native-функции. Внутри последней присваивать полям переданного объекта необходимые (возвращенные C++) значения. Проблема в таком решении, что для каждой функции потребуется создавать свой отдельный класс-представитель с перечнем своих полей-параметров. Вот и сижу - голову ломаю. Может быть кто-то из уважаемых форумчан сталкивался с такой задачей и/или может подсказать наиболее оптимальное ее решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2017, 10:39 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Я-бы все сериализировал в JSON на стороне С++ и передавал строками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2017, 11:02 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
avs63Привет всем, Возникла потребность реализовать в Java интерфейсные native -функции со сторонней C++ библиотекой. Вся беда в том, что многие функции в этой библиотеке возвращают значения через свои REF-параметры. А как их передать обратно в native-функцию Java пока никак не придумаю. С Java дружу не так давно, опыта мало, и на ум приходит, пока, только одно решение: создать некий промежуточный класс с описанием внутренних полей-параметров, количество которых будет совпадать с количеством REF-параметров в c++ функции, и передавать такой объект в качестве одного из параметров native-функции. Внутри последней присваивать полям переданного объекта необходимые (возвращенные C++) значения. Проблема в таком решении, что для каждой функции потребуется создавать свой отдельный класс-представитель с перечнем своих полей-параметров. Вот и сижу - голову ломаю. Может быть кто-то из уважаемых форумчан сталкивался с такой задачей и/или может подсказать наиболее оптимальное ее решение? А есть какие то требования по производительности ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2017, 11:48 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
am_sasaJNA не советовал бы, если нужна производительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2017, 11:53 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
avs63Привет всем, Возникла потребность реализовать в Java интерфейсные native -функции со сторонней C++ библиотекой. Вся беда в том, что многие функции в этой библиотеке возвращают значения через свои REF-параметры. А как их передать обратно в native-функцию Java пока никак не придумаю. С Java дружу не так давно, опыта мало, и на ум приходит, пока, только одно решение: создать некий промежуточный класс с описанием внутренних полей-параметров, количество которых будет совпадать с количеством REF-параметров в c++ функции, и передавать такой объект в качестве одного из параметров native-функции. Внутри последней присваивать полям переданного объекта необходимые (возвращенные C++) значения. Проблема в таком решении, что для каждой функции потребуется создавать свой отдельный класс-представитель с перечнем своих полей-параметров. Вот и сижу - голову ломаю. Может быть кто-то из уважаемых форумчан сталкивался с такой задачей и/или может подсказать наиболее оптимальное ее решение? Выделяете память и льете туда в сериализованном виде на стороне С++ Джаве передаете указатель и соотв десериализуете на стороне Джавы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2017, 11:55 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Здесь тоже автора надо спросить о платформе. Поскольку это С++ то такие пустяки как размер символа (char) и длина integer, текущая локаль и кодировка и BigEndian уже не эфемерны а совершенно реальны и надо с ними что-то делать. Я не верю что какие-то Java-библиотеки дистанциируют нас от этих вопросов. Просто не верю. Полюбому "стрельнет". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2017, 11:59 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Спасибо всем откликнувшимся. Существенных требований к производительности пока нет. Т.е. задача не real-time. Наверное, больше интересует простота интеграции и надежность решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2017, 12:13 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
avs63, отпишись как получилось. Мне интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2017, 12:15 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Да и платформа MS Windows. (Visual studio 2008) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2017, 12:17 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Появилась идея передавать ByRef-аргументы в native функцию в виде AtomicReference объектов и уже внутри последней, вызовом метода set(v), присваивать значения, возвращенные c++ функцией. На выходе получаем значения методом get(). Судя по описанию пакета atomic должно сработать. Надо пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 12:41 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
avs63Появилась идея передавать ByRef-аргументы в native функцию в виде AtomicReference объектов и уже внутри последней, вызовом метода set(v), присваивать значения, возвращенные c++ функцией. На выходе получаем значения методом get(). Судя по описанию пакета atomic должно сработать. Надо пробовать. Хотите ява объекты конструировать прямо из плюсов ? Удачи ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 12:42 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Конструировать из плюсов не надо. Изначально объект будет создан в Java. В c++ только будет вызываться для него метод set(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 12:44 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
avs63Конструировать из плюсов не надо. Изначально объект будет создан в Java. В c++ только будет вызываться для него метод set(). Ссылку на что Вы туда сетить будете ? На С++ объект или на что ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 12:47 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
BlazkowiczСемен.СеменовичХотите ява объекты конструировать прямо из плюсов ? Какие сложности? Под прямо из плюсов я имел ввиду прямо из плюсов ))) Я то все о производительности задумываюсь )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 12:50 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Если на производительность пофигу - делаем все через XML :) и передаем через SOAP :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 12:51 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Семен.Семенович Не пойму Вашего сарказма. Если внутри c-функции я получил необходимые значения от host-функции, и зная их типы, какая проблема вызвать через JNI метод set() для соответствующего переданного Java-объекта (параметра), класс которого известен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 12:59 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
avs63Семен.Семенович Не пойму Вашего сарказма. Если внутри c-функции я получил необходимые значения от host-функции, и зная их типы, какая проблема вызвать через JNI метод set() для соответствующего переданного Java-объекта (параметра), класс которого известен? Никаких используя JNI можно сделать все что угодно. Можно также использовать упомянутый XML + Soap. Можно все положить в оракл а из явы вытащить из оракла Можно отправить по почте и прочитать с явы. Все варианты хороши, если на перфоманс пофигу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 13:06 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
https://github.com/aclindsa/jnioverhead Вот поиграйтесь Раза в 2 просадка производительности при вызове JNI без параметров Если появляются параметры все становится еще плачевнее А уж создание Java объектов из С++ и работа с ними через JNI слой заставляет содрогнуться волосы на моей голове. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 13:18 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Семен.Семенович Про производительность JNI спорить не буду - тут, наверное, Вы правы. Но, как я уже писал, задача у меня не real-time. Главное, чтобы работала, и с высокой степенью надежности/предсказуемости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 13:31 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
avs63Семен.Семенович Про производительность JNI спорить не буду - тут, наверное, Вы правы. Но, как я уже писал, задача у меня не real-time. Главное, чтобы работала, и с высокой степенью надежности/предсказуемости. Да всех благ. Я там еще 5-ок способов передать из плюсов в яву представил )))) А вообще смотрим батл гнойного ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 13:33 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
avs63Главное, чтобы работала Вы не поняли. Работать будут все варианты. Даже через json или базу как трубопровод передачи. Получается, пишите как умеете. Пишите обертку класс над dll, а там как хотите. Требований нету и внутреннее дело класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 14:20 |
|
||
|
Сложная native-функция
|
|||
|---|---|---|---|
|
#18+
Сегодня JSON-парсеры в Java быстры как никогда. Браузерные игры на них делают и прочее. Вобщем-то тут и думать нечего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2017, 21:36 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39509788&tid=2122630]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 196ms |
| total: | 367ms |

| 0 / 0 |
