JNI開發之JNI常見錯誤

  在上一篇文章中對JNI原理進行了介紹,這篇文章將對JNI開發中的一些常見錯誤進行總結一下。

一、常見錯誤原因分析

  在JNI開發中,經常會遇到各種各樣的錯誤,這裏總結一下:
  • find Library returned null
     原因:CPU平臺不匹配或者在加載類庫時,類庫名字寫錯了
  • Exception in thread"main" java.lang.NoClassDefFoundError: xxx
        原因:一般是由於FindClass方法查找不到Java類造成的,檢查FindClass的參數是否正確。
  • Exception in thread"main" java.lang.UnsatisfiedLinkError: no xxx in java.library.path
        原因:這表示本地代碼庫找不到,確認java在執行時,“-Djava.library.path”參數是否正確。
  • Exception in thread"main" java.lang.NoSuchMethodError: xxx
        原因:Java與本地方法的鏈接映射時出現錯誤,先確認下Java中有沒有對應xxx方法聲明,如果有,確認RegisterNatives註冊映射關係的簽名是否匹配。
  • Exception in thread"main" java.lang.NoSuchFieldError:xxx
       原因:這表示在本地代碼中訪問xxx屬性時,在java代碼中沒有該屬性,先確認該屬性是否定義,如果有定義,看下屬性是靜態屬性還是非靜態屬性,如果是靜態屬性,本地方法只能通過Get/SetStatic<Type>Field來訪問,如果是非靜態屬性,本地方法只能通過Get/Set<Type>Field來訪問。

二、異常處理

  異常處理:Java層出現異常,虛擬機會直接拋出異常,這是需要通過try-catch或者繼續往外throw。但是對於JNI出現異常時,即執行到JNIEnv中某個函數異常時,並不會立即拋出異常來中斷程序執行,還可以繼續執行內存之類的清理工作,直到返回到Java層時才拋出相應的異常。即native的異常要到Java代碼中取捕獲處理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章