2009-07-30 76 views
0

比方說,我甲肝:何時重新編譯JNI綁定和客戶端代碼?

  1. C庫libfoo
  2. JNI綁定的包org.foo.jnilibfoo,並
  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中的類?
  • 如果由於libfoo中的某些更改而導致org.foo.jni中的類重新編譯,但不要將界面更改爲org.foo.jni,那麼是否需要重新編譯com.user.of.foo中的類?

回答

3

如果我改變libfoo的修復一個bug,但 不改變接口,我必須 重新編譯 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的調用必須遵守接口。兩者可以單獨開發(實際上幾乎總是)並且在不同的時間開發。如果界面更改,則兩者都必須更改爲更新到新界面。

希望有所幫助。

相關問題