В JNI, когда возвращается структура из C / C ++, копирует ли JVM (возможно, в свою кучную память)? [Дубликат]

>>> original = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> tuple([list(tup) for tup in zip(*original)])
(['a', 'b', 'c', 'd'], [1, 2, 3, 4])

Дает кортеж списков, как в вопросе.

list1, list2 = [list(tup) for tup in zip(*original)]

Распаковывает два списка.

57
задан Nik Reiman 13 October 2010 в 13:15
поделиться

4 ответа

Вам нужно создать класс Java с теми же членами, что и C struct, и «отобразить» их в коде C с помощью методов env-> GetIntField, env-> SetIntField, env-> GetFloatField, env-> SetFloatField и и так далее - короче говоря, много ручного труда, мы надеемся, что уже существуют программы, которые делают это автоматически: JNAerator ( http://code.google.com/p/jnaerator ) и SWIG ( http://www.swig.org/). У обоих есть свои плюсы и минусы, выбор зависит от вас.

37
ответ дан André Puel 22 August 2018 в 01:58
поделиться
  • 1
    Не могли бы вы вставить некоторые простые примеры кода такой интеграции? – Centurion 28 November 2012 в 11:26
  • 2
    @Centurion Я знаю, что URL-адреса, как правило, не одобряются, но это комментарий, и я нашел эту веб-страницу. Очень полезно разобраться в этом: www3.ntu.edu.sg/home/ehchua/programming/java/… – James 23 November 2013 в 01:20
  1. Сделайте класс на обеих сторонах Java и C ++, просто вставив переменные-члены. Структуры C ++ - это действительно просто классы с общедоступными элементами данных. Если вы действительно в чистом C, перестаньте читать.
  2. Используйте свои IDE (ы), чтобы автоматически создавать сеттеры и геттеры для переменных-членов.
  3. Использовать javah для генерации заголовка C файл из класса Java.
  4. Сделайте некоторое редактирование на стороне C ++, чтобы сеттеры и геттеры соответствовали сгенерированному файлу заголовков.
  5. Поместите код JNI.

Это не идеальное решение, но это может сэкономить вам немного времени, и оно по крайней мере даст вам скелет, который вы можете редактировать. Эта функциональность может быть добавлена ​​в IDE, но без большого спроса, вероятно, этого не произойдет. Большинство IDE даже не поддерживают проекты смешанного языка, не говоря уже о том, чтобы они разговаривали друг с другом.

-1
ответ дан Bill 22 August 2018 в 01:58
поделиться

Это сбой, потому что Java_com_myorg_MyJavaClass_createNewMyStruct объявляется как возвращающий «jobject», но на самом деле возвращает struct MyStruct. Если вы запускаете это с включенным CheckJNI, виртуальная машина будет громко жаловаться и прерываться. Функция processData () также будет довольно расстроена из-за того, что она передается в «аргументах».

Рабочий объект - объект на управляемой куче. Он может иметь дополнительный материал до или после объявленных полей, и поля не должны быть выложены в памяти в каком-либо конкретном порядке. Таким образом, вы не можете сопоставить структуру C над классом Java.

Самый простой способ справиться с этим был идентифицирован в более раннем ответе: манипулировать заданием с помощью функций JNI. Выделите объекты с Java или с помощью NewObject, Get / Set полей объекта с соответствующими вызовами.

Существуют различные способы «обманывать» здесь. Например, вы можете включить байт [] в свой Java-объект, который содержит байты sizeof (struct MyStruct), а затем использовать GetByteArrayElements, чтобы получить указатель на него. Немного уродливый, особенно если вы хотите получить доступ к полям со стороны Java.

8
ответ дан fadden 22 August 2018 в 01:58
поделиться

Структура C представляет собой набор переменных (некоторые из них являются указателями на функции). Переход к java - это не очень хорошая идея. В общем, проблема заключается в том, как передавать более сложный тип в java, например указатель.

В книге JNI рекомендуется сохранить указатель / структуру в нативной и экспортной манипуляции в java. Вы можете прочитать полезные статьи. Руководство и спецификация программиста по интерфейсу JavaTM, Я прочитал. 9.5 Одноранговые классы имеют решение для решения проблемы.

6
ответ дан qrtt1 22 August 2018 в 01:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: