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 依賴、架構不匹配
}
loadLibrary 參數**不含路徑分隔符**,只寫庫名 DLLforProbe。需確保 DLL 放在 java.library.path 目錄下(如 WEB-INF/lib、系統 PATH、-Djava.library.path=...)。Dependency Walker 檢查 DLL 是否缺少 MSVC Runtime、其他第三方 DLL。java -d64 -version 驗證。JNIEXPORT jint JNICALL Java_SketchYourHouse_MediumInCJ_getProbeFeature 必須與 Java native int getProbeFeature() 完全對應(包名+類名+方法名)。try-catch 打印 UnsatisfiedLinkError 詳細訊息:static {
try { System.loadLibrary("DLLforProbe"); }
catch (UnsatisfiedLinkError e) { e.printStackTrace(); throw e; }
}public class TestJNI { static{System.loadLibrary("DLLforProbe");} public native int test(); public static void main(String[]a){System.out.println(new TestJNI().test());} }。java -Djava.library.path=./dll TestJNI 運行,觀察是否載入成功。WEB-INF/lib 或 Tomcat shared.loader 包含 DLL 目錄。