Позвоните мой собственный Java-код из C # - PullRequest
2 голосов
/ 14 января 2010

Имея свой собственный код Java, я использую C # для вызова некоторого неуправляемого кода, который вызывает (через JNI) код Java. Я использую JNI, так как мне нужно убедиться:

  • возможность того, что код Java будет работать на реальной JVM, а не на некоторых .NET VM
  • возможность подключения к ВМ для отладки (IKVM не поддерживает)
  • Мне нужно бесплатное решение
  • Текущие бесплатные решения не применимы (например, IKVM)

В любом случае, мой вопрос заключается в том, как наилучшим образом управлять строками, передаваемыми между этими слоями, без утечек. Я делаю что-то вроде:

[DllImport(@"MyDll.dll")]
public extern static void receive_message(string receDest, StringBuilder response);

Это означает, что я выделяю память для ответа в управляемом коде. Я хочу этого избежать, так как заранее не знаю длины ответа. Как я могу написать соответствующий метод JNI, который будет выделять правильный буфер для управляемого кода без утечек. Код JNI должен быть потокобезопасным.

Есть предложения?

Спасибо

Guy

Ответы [ 5 ]

6 голосов
/ 14 января 2010

Вам может нужен JNI, но ваши требования на самом деле не указывают на это.

Требование использовать реальную JVM не диктует использование JNI. Я бы посоветовал отточить ваши требования или рассмотреть возможность более слабой связи. Например, сокеты, веб-службы, общая база данных, общий файл или очередь .

Если вам действительно нужно, чтобы Java и .NET работали в одном и том же процессе с жесткой связью, рассмотрите JNBridge .
Они решили проблему, с которой вы сталкиваетесь.

2 голосов
/ 14 января 2010

Возможно, вас заинтересует попытка преобразовать код байт-кода Java в .NET CIL с помощью IKVM.NET .

.
1 голос
/ 25 января 2010

Парень - Относительно ответа Чизо и ваших ответов на него:

  • JNBridgePro позволяет автоматически запускать JVM и запускать внутри процесса .NET (в дополнение к возможности его явного запуска). См. Механизм связи с разделенной памятью, описанный в документации.

  • JNBridgePro позволяет подключать отладчик Java, даже если JVM работает внутри процесса .NET. Свяжитесь с support@jnbridge.com для получения подробной информации, а также подробностей о настройке JVM.

  • Ничего не поделаешь, если не быть свободным, но, в любом случае, стоит проверить это.

Раскрытие: да, я с JNBridge.

1 голос
/ 14 января 2010

По сути, вам нужно сделать удаленный вызов в java-программу из вашего .NET-кода.

С вашим текущим набором навыков я бы предложил вам создать веб-сервис на компьютере Java - это относительно просто в Java 6 - и на основе WSDL создать клиента в вашей программе .NET.

Это, пожалуй, самое чистое решение с современными технологиями.

Если по какой-то причине этого недостаточно, добавьте к своему вопросу.

0 голосов
/ 17 января 2010

Я думаю, вы могли бы использовать jni4net в качестве библиотеки моста. Или вы можете просто взглянуть на исходный код и получить некоторые идеи (LGPL / GPL).

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