首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JNI 調用 C++ DLL 報 NoClassDefFoundError: Could not initialize class 解決

     編輯:程式設計疑難解答

錯誤堆疊

java.lang.NoClassDefFoundError: Could not initialize class SketchYourHouse.MediumInCJ
    at SketchYourHouse.SketchBeans.savePic(SketchBeans.java:56)
    at SketchYourHouse.SketchServlet.doPost(SketchServlet.java:46)

根因分析

NoClassDefFoundError: Could not initialize class 表示類已找到,但在**靜態初始化塊**執行時拋出異常導致類初始化失敗。此處 MediumInCJ 的靜態塊:

static {
    System.loadLibrary("dll/DLLforProbe");  // 疑點:路徑寫法、DLL 依賴、架構不匹配
}

排查清單

  1. DLL 路徑:loadLibrary 參數**不含路徑分隔符**,只寫庫名 DLLforProbe。需確保 DLL 放在 java.library.path 目錄下(如 WEB-INF/lib、系統 PATH、-Djava.library.path=...)。
  2. 依賴缺失:用 Dependency Walker 檢查 DLL 是否缺少 MSVC Runtime、其他第三方 DLL。
  3. 位數匹配:JVM 64 位需載入 64 位 DLL,32 位同理。java -d64 -version 驗證。
  4. JNI 函數簽名:C++ 端 JNIEXPORT jint JNICALL Java_SketchYourHouse_MediumInCJ_getProbeFeature 必須與 Java native int getProbeFeature() 完全對應(包名+類名+方法名)。
  5. 靜態塊異常吞沒:在靜態塊加 try-catch 打印 UnsatisfiedLinkError 詳細訊息:
    static {
        try { System.loadLibrary("DLLforProbe"); }
        catch (UnsatisfiedLinkError e) { e.printStackTrace(); throw e; }
    }

快速驗證步驟

  1. 寫獨立測試類 public class TestJNI { static{System.loadLibrary("DLLforProbe");} public native int test(); public static void main(String[]a){System.out.println(new TestJNI().test());} }。
  2. 在命令行 java -Djava.library.path=./dll TestJNI 運行,觀察是否載入成功。
  3. 成功後再遷移回 Web 專案,確保 WEB-INF/lib 或 Tomcat shared.loader 包含 DLL 目錄。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved