Когда перекомпилировать привязки JNI и клиентский код? - PullRequest
0 голосов
/ 30 июля 2009

Допустим, у меня есть:

  1. библиотека C libfoo,
  2. пакет org.foo.jni привязок JNI к libfoo и
  3. пакет com.user.of.foo кода клиента.

Очевидно, что если функции, которые org.foo.jni затрагивают в libfoo, меняются, мне нужно перекомпилировать классы в org.foo.jni. И, конечно же, если методы, которые com.user.of.foo затрагивают в org.foo.jni, меняются, мне нужно перекомпилировать классы в com.user.of.foo. Но ...

  • Если я изменю libfoo, чтобы исправить ошибку, но не изменю интерфейс, я должен перекомпилировать классы в org.foo.jni?
  • Если я изменю интерфейс на libfoo, но только в функциях, не вызываемых из org.foo.jni, нужно ли перекомпилировать классы в org.foo.jni?
  • Если я перекомпилирую классы в org.foo.jni из-за некоторых изменений в libfoo, но не изменяю интерфейс на org.foo.jni, нужно ли мне перекомпилировать классы в com.user.of.foo?

1 Ответ

3 голосов
/ 30 июля 2009

Если я изменю libfoo, чтобы исправить ошибку, но не меняйте интерфейс, у меня есть перекомпилировать классы в org.foo.jni

Нет. Если интерфейсы не изменяются, то код Java / код интерфейса не нужно перекомпилировать. Это является частью мощи кода JNI - интерфейсы могут оставаться прежними, в то время как базовая специфичная для системы реализация может измениться.

Если я изменю интерфейс на libfoo, но только в функциях, не вызываемых из org.foo.jni, я должен перекомпилировать классы в org.foo.jni?

Должны ли вы, вы должны, ИМО. Классы, вероятно, будут работать, хотя если вы не правы, вы получите исключение (исключение UnimplementedMethod, iirc)

Если я перекомпилирую классы в org.foo.jni из-за некоторых изменений в libfoo, но не меняйте интерфейс к org.foo.jni, я должен перекомпилировать классы в com.user.of.foo?

Нет, по тем же причинам, что и в вашем первом вопросе. Смысл интерфейса заключается в том, что эти два аспекта являются отдельными, и их можно разрабатывать и компилировать отдельно.

Одним из способов думать о JNI является использование примера последовательного порта. Базовая реализация последовательного порта должна соответствовать интерфейсу, а вызовы из Java должны соответствовать интерфейсу. Эти два могут быть разработаны отдельно (и фактически почти всегда) и в разное время. Если интерфейс изменяется, оба должны измениться, чтобы обновиться до нового интерфейса.

Надеюсь, это поможет.

...