Привет, я думал, что введу свой ответ на это, хотя уже поздно. Я думаю, что есть несколько важных вещей, которые нужно рассмотреть в первую очередь, насколько сильно вы хотите иметь связь между Java и Python.
Во-первых Вы хотите только вызывать функции или действительно хотите, чтобы код Python изменял данные в ваших Java-объектах? Это очень важно. Если вы хотите вызвать только некоторый код Python с аргументами или без них, то это не очень сложно. Если ваши аргументы являются примитивами, это делает это еще проще. Однако если вы хотите, чтобы java-класс реализовывал функции-члены в python, которые изменяют данные объекта java, то это не так просто или просто.
Во-вторых мы говорим на cpython или подойдет jython? Я бы сказал, что cpython это где! Я бы защищал это, почему питон такой крутой! Имея такие высокие абстракции, однако доступ к c, c ++ при необходимости. Представьте себе, если бы вы могли иметь это в Java. Этот вопрос даже не стоит задавать, если с jython все в порядке, потому что тогда все равно легко.
Итак, я играл со следующими методами и перечислил их от простого к сложному:
Java для Jython
Преимущества: Тривиально просто. Имеют фактические ссылки на объекты Java
Недостатки: Нет CPython, очень медленно!
Jython из java очень прост, и если этого действительно достаточно, то отлично. Однако это очень медленно и не cpython! Стоит ли жить без cpython, я так не думаю! Вы можете легко получить код Python, реализующий ваши функции-члены для ваших объектов Java.
Java с Jython на CPython через Pyro
Pyro - это модуль удаленного объекта для python. У вас есть некоторый объект в интерпретаторе cpython, и вы можете отправлять ему объекты, которые передаются через сериализацию, и он также может возвращать объекты с помощью этого метода. Обратите внимание: если вы отправляете сериализованный объект python из jython, а затем вызываете некоторые функции, которые изменяют данные в его членах, вы не увидите эти изменения в java. Вам просто нужно помнить, чтобы отправить обратно данные, которые вы хотите от пиро. Я считаю, что это самый простой способ попасть в cpython! Вам не нужны никакие jni, jna, swig или .... Вам не нужно знать ни c, ни c ++. Кул, да?
Преимущества: Доступ к cpython, не такой сложный, как следующие методы
Недостатки: Невозможно изменить данные об элементах java-объектов напрямую из python. Несколько косвенно, (jython - средний человек).
Java на C / C ++ через JNI / JNA / SWIG на Python через встроенный интерпретатор (возможно, с использованием библиотек BOOST?)
О Боже, этот метод не для слабонервных. И я могу сказать вам, что мне понадобилось очень много времени, чтобы добиться этого приличным методом. Основная причина, по которой вы захотите это сделать, заключается в том, что вы можете запускать код cpython, который полностью контролирует ваш Java-объект. Перед тем, как попробовать попробовать java (которая похожа на шимпанзе) с python (которая похожа на лошадь), необходимо учесть основные важные моменты. Во-первых, если вы выйдете из строя, переводчик отключит вашу программу! И не заводите меня на проблемы параллелизма! Кроме того, есть много отведенного котла, я считаю, что я нашел лучшую конфигурацию для минимизации этого котла, но все же он отведен! Итак, как это сделать:
Учтите, что C ++ - ваш посредник, ваши объекты на самом деле являются объектами C ++! Хорошо, что ты это знаешь сейчас. Просто напишите ваш объект, как будто ваша программа, как в cpp, а не в java, с данными, к которым вы хотите получить доступ из обоих миров. Затем вы можете использовать генератор-обертку с именем swig (http://www.swig.org/Doc1.3/Java.html), чтобы сделать это доступным для java, и скомпилировать dll, который вы называете System.load (имя dll здесь) в java. Сначала запустите это, затем перейдите к сложная часть!Чтобы попасть на python, вам нужно встроить интерпретатор.Во-первых, я предлагаю сделать несколько программ-интерпретаторов hello или этот урок Встраивание python в C / C .Как только у вас все получится, самое время заставить лошадь и обезьяну танцевать!Вы можете отправить свой объект c ++ в python через [boost] [3].Я знаю, что я не дал вам рыбу, просто сказал вам, где найти рыбу.Некоторые указания, на которые следует обратить внимание при компиляции.
Когда вы компилируете boost, вам нужно будет скомпилировать общую библиотеку.И вам нужно включить и ссылаться на то, что вам нужно из jdk, т.е. jawt.lib, jvm.lib, (вам также понадобится клиент jvm.dll на вашем пути при запуске приложения), а также python27.lib иличто угодно и boost_python-vc100-mt-1_55.lib.Затем включите Python / include, jdk / include, boost и используйте только общие библиотеки (dll), в противном случае boost имеет слезоточивый характер.И да, в полной мере я знаю.Есть так много способов, которыми это может испортиться.Поэтому убедитесь, что вы делаете каждую вещь блок за блоком.Тогда соедините их.