我使用Java JNI與Gdal。有一些服務器端應用程序構建在JNI綁定之上。如果JNI部分中存在錯誤,則整個JVM堆棧會丟失。Java JNI stackfall prevention
測試一個c/C++庫不包含會導致JVM堆棧墜落的致命錯誤的最佳方法是什麼?清理處理出現的錯誤的最佳做法是什麼?
我使用Java JNI與Gdal。有一些服務器端應用程序構建在JNI綁定之上。如果JNI部分中存在錯誤,則整個JVM堆棧會丟失。Java JNI stackfall prevention
測試一個c/C++庫不包含會導致JVM堆棧墜落的致命錯誤的最佳方法是什麼?清理處理出現的錯誤的最佳做法是什麼?
兩件事情浮現在腦海中:
1)。如果你有任何可能將C++代碼作爲一個單獨的進程運行(使用任何RPC技術進行通信),那麼你可以躲避這個問題,儘管這是以犧牲性能爲代價的。 2)。你是在C++/JNI開發人員的憐憫。我懷疑的大部分問題都在JNI層的「皮膚」上。也就是說,我有一個相當穩定的現有庫,我用JNI包裝起來。如果我無意中將空指針傳遞給現有代碼,那麼庫會感到不安,如果我沒有檢查出空值,我也可能會遇到問題。所以我們花費了很多精力來消毒這個包裝層。任何地方都有可能出現意想不到的結果,我們增加了檢查。
當然,如果整個圖書館都是新的,那麼生活就會變得更加艱難 - 最後你只需生成健壯的代碼即可。
GDAL是相對穩定的使用良好的C/C++庫。我猜,JNI包裝器部分需要更多的愛。我會研究通過「皮膚」消毒的東西。 – whatnick 2009-11-12 17:00:48
您是否打開了這些JVM設置?
-verbose:jni -Xcheck:jni
我發現它們對於JNI代碼的初始開發非常有價值。
-Xcheck:jni
選項激活一組圍繞JNI函數的包裝函數。包裝函數對傳入參數執行檢查。這些檢查包括:
Get<Type>Field
或Set<Type>Field
呼叫。
測試只能告訴你是否存在缺陷,而不是缺少缺陷。 – 2009-11-12 11:28:52
它可以告訴我,如果沒有人在場嗎? :p – whatnick 2009-11-12 17:04:25