>>> 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)]
Распаковывает два списка.
Вам нужно создать класс Java с теми же членами, что и C struct, и «отобразить» их в коде C с помощью методов env-> GetIntField, env-> SetIntField, env-> GetFloatField, env-> SetFloatField и и так далее - короче говоря, много ручного труда, мы надеемся, что уже существуют программы, которые делают это автоматически: JNAerator ( http://code.google.com/p/jnaerator ) и SWIG ( http://www.swig.org/). У обоих есть свои плюсы и минусы, выбор зависит от вас.
Это не идеальное решение, но это может сэкономить вам немного времени, и оно по крайней мере даст вам скелет, который вы можете редактировать. Эта функциональность может быть добавлена в IDE, но без большого спроса, вероятно, этого не произойдет. Большинство IDE даже не поддерживают проекты смешанного языка, не говоря уже о том, чтобы они разговаривали друг с другом.
Это сбой, потому что Java_com_myorg_MyJavaClass_createNewMyStruct объявляется как возвращающий «jobject», но на самом деле возвращает struct MyStruct. Если вы запускаете это с включенным CheckJNI, виртуальная машина будет громко жаловаться и прерываться. Функция processData () также будет довольно расстроена из-за того, что она передается в «аргументах».
Рабочий объект - объект на управляемой куче. Он может иметь дополнительный материал до или после объявленных полей, и поля не должны быть выложены в памяти в каком-либо конкретном порядке. Таким образом, вы не можете сопоставить структуру C над классом Java.
Самый простой способ справиться с этим был идентифицирован в более раннем ответе: манипулировать заданием с помощью функций JNI. Выделите объекты с Java или с помощью NewObject, Get / Set полей объекта с соответствующими вызовами.
Существуют различные способы «обманывать» здесь. Например, вы можете включить байт [] в свой Java-объект, который содержит байты sizeof (struct MyStruct), а затем использовать GetByteArrayElements, чтобы получить указатель на него. Немного уродливый, особенно если вы хотите получить доступ к полям со стороны Java.
Структура C представляет собой набор переменных (некоторые из них являются указателями на функции). Переход к java - это не очень хорошая идея. В общем, проблема заключается в том, как передавать более сложный тип в java, например указатель.
В книге JNI рекомендуется сохранить указатель / структуру в нативной и экспортной манипуляции в java. Вы можете прочитать полезные статьи. Руководство и спецификация программиста по интерфейсу JavaTM, Я прочитал. 9.5 Одноранговые классы имеют решение для решения проблемы.