ในแอปพลิเคชัน Eclispe RCP มีวิธีตรวจสอบว่ามีไลบรารีเนทีฟเฉพาะในระบบปัจจุบันหรือไม่
ใช้ System.loadLibrary("myLib"); จากนั้นการตรวจจับ UnsatisfiedLinkError จะส่งผลให้บันเดิลอื่นไม่สามารถใช้ไลบรารีได้ เนื่องจากจะนำไปสู่ข้อผิดพลาด "Library โหลดแล้วโดยตัวโหลดคลาสอื่น"
ฉันพบวิธีแก้ไขปัญหานี้บนอินเทอร์เน็ตซึ่งใช้คลาสโหลดเดอร์แบบกำหนดเอง ซึ่งจะโหลดไลบรารี จากนั้นคลาสโหลดเดอร์จะถูกรวบรวมขยะด้วย System.gc() ซึ่งจะยกเลิกการโหลดไลบรารีเพื่อให้สามารถโหลดได้ อีกครั้งโดยอีกกลุ่มหนึ่ง
อย่างไรก็ตาม มีข้อเสียดังนี้:
- ต้องใช้รหัสที่กำหนดเองจำนวนมาก
- การจับ UnsatfisfiedLinkError ค่อนข้างน่ากลัว
- สมมติว่า Bundle1 โหลดไลบรารีเพื่อตรวจสอบความพร้อมใช้งาน จากนั้น Bundle1 จะยกเลิกการโหลดไลบรารี่ และ Bundle2 จะโหลดไลบรารีเพื่อใช้งานจริง Bundle2 ไม่ยกเลิกการโหลดไลบรารี (เนื่องจากไม่มีเหตุผลที่จะทำเช่นนั้น) จากนั้น Bundle1 ต้องการโหลดไลบรารีอีกครั้งเพื่อตรวจสอบความพร้อมใช้งาน สิ่งนี้จะนำไปสู่ UnsatisfiedLinkError อีกครั้ง