Если я изменю 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 должны соответствовать интерфейсу. Эти два могут быть разработаны отдельно (и фактически почти всегда) и в разное время. Если интерфейс изменяется, оба должны измениться, чтобы обновиться до нового интерфейса.
Надеюсь, это поможет.