Какой самый быстрый способ получить доступ к нативному коду из Java? - PullRequest
9 голосов
/ 08 апреля 2009

Какой самый быстрый способ вызова нативной библиотеки из Java?

Те, о которых я знаю,

  • NativeCall - то, что мы сейчас используем
  • JNA - не использовал его, но выглядит разумным
  • JNI - выглядит ужасно писать, но мы сделаем это, если получим скорость

Ответы [ 4 ]

12 голосов
/ 08 апреля 2009

Swig также облегчает JNI.

С точки зрения скорости, я подозреваю, что будут небольшие отклонения - я настоятельно рекомендую вам выбрать звонок, который, как вы знаете, вы будете делать много, и сравнить все предлагаемые решения.

10 голосов
/ 08 апреля 2009

JNI самый быстрый. JNA очень медленный по сравнению с JNI (издержки на вызовы, вероятно, на порядок), но это фантастическая библиотека, потому что она делает нативный доступ таким простым. JNA отлично подходит, если вам нужно время от времени вызывать какой-то нативный API. Если вам небезразлична производительность, я бы не стал использовать ее в каких-либо «крутых петлях».

Я не уверен, где NativeCall вписывается в спектр.

3 голосов
/ 08 апреля 2009

Многие параметры влияют на производительность интерфейсов между языками программирования: на каком устройстве работает JVM, кто его разработал (в случае, если это не обычная Sun JVM), нужно ли вам вызывать код Java из собственного кода, модель потоков JVM в вашей операционной системе и насколько асинхронным будет нативный код ...

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

2 голосов
/ 08 апреля 2009

В этой записи блога утверждается, что из-за механизмов самоанализа, используемых JNA, он будет значительно медленнее, чем JNI. Я подозреваю, что NativeCall будет использовать аналогичные механизмы и, следовательно, работать аналогичным образом.

Однако вам, вероятно, следует провести тестирование на основе конкретных объектов, на которые вы ссылаетесь, и / или маршалинг между Java и C.

Я бы поддержал рекомендацию SWIG . Это делает жизнь особенно простой (легкой) для интерфейса Java / C.

...