簡體   English   中英

Java JNI Stackfall預防

[英]Java JNI stackfall prevention

我將Java JNI與Gdal一起使用 在JNI綁定之上構建了一些服務器端應用程序。 如果JNI節中有錯誤,則整個JVM堆棧將下降。

測試ac / c ++庫不包含會導致JVM堆棧下降的致命錯誤的最佳方法是什么? 徹底解決出現的錯誤的最佳實踐是什么?

您是否已打開這些JVM設置?

-verbose:jni -Xcheck:jni

我發現它們對於JNI代碼的最初開發非常寶貴。

-Xcheck:jni選項激活圍繞JNI函數的一組包裝器函數。 包裝函數對傳入的參數執行檢查。 這些檢查包括:

  • 該調用和初始化JNI的調用是否在同一線程上。
  • 對象參數是否為有效對象。
  • 本地引用還是全局引用都引用有效對象。
  • 字段的類型是否匹配Get<Type>FieldSet<Type>Field調用。
  • 靜態和非靜態字段ID是否有效。
  • 字符串是否有效和非空。
  • 數組元素是否為非null。
  • 數組元素上的類型。

我想到兩件事:

1)。 如果您有可能將C ++代碼作為一個單獨的進程運行(使用任何RPC技術進行通信),則可以避開此問題,盡管會犧牲性能。

2)。 您是C ++ / JNI開發人員的擺布。 我提倡的大多數問題都在JNI層的“皮膚”上。 也就是說,我有一個相當穩定的現有庫,我將其包裝在JNI中。 如果我無意中將空指針傳遞給了現有代碼,該庫將變得不高興,並且如果我未能檢查空值作為響應,我也會遇到問題。 因此,我們付出了很多努力來清理該包裝層。 在可能出現意外結果的任何地方,我們都添加了檢查功能。

當然,如果整個庫是新庫,那么生活會更艱難-最后,您只需要生成可靠的代碼即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM