Eclipse RCP: ตรวจสอบ Native Library

ในแอปพลิเคชัน Eclispe RCP มีวิธีตรวจสอบว่ามีไลบรารีเนทีฟเฉพาะในระบบปัจจุบันหรือไม่

ใช้ System.loadLibrary("myLib"); จากนั้นการตรวจจับ UnsatisfiedLinkError จะส่งผลให้บันเดิลอื่นไม่สามารถใช้ไลบรารีได้ เนื่องจากจะนำไปสู่ข้อผิดพลาด "Library โหลดแล้วโดยตัวโหลดคลาสอื่น"

ฉันพบวิธีแก้ไขปัญหานี้บนอินเทอร์เน็ตซึ่งใช้คลาสโหลดเดอร์แบบกำหนดเอง ซึ่งจะโหลดไลบรารี จากนั้นคลาสโหลดเดอร์จะถูกรวบรวมขยะด้วย System.gc() ซึ่งจะยกเลิกการโหลดไลบรารีเพื่อให้สามารถโหลดได้ อีกครั้งโดยอีกกลุ่มหนึ่ง

อย่างไรก็ตาม มีข้อเสียดังนี้:

  1. ต้องใช้รหัสที่กำหนดเองจำนวนมาก
  2. การจับ UnsatfisfiedLinkError ค่อนข้างน่ากลัว
  3. สมมติว่า Bundle1 โหลดไลบรารีเพื่อตรวจสอบความพร้อมใช้งาน จากนั้น Bundle1 จะยกเลิกการโหลดไลบรารี่ และ Bundle2 จะโหลดไลบรารีเพื่อใช้งานจริง Bundle2 ไม่ยกเลิกการโหลดไลบรารี (เนื่องจากไม่มีเหตุผลที่จะทำเช่นนั้น) จากนั้น Bundle1 ต้องการโหลดไลบรารีอีกครั้งเพื่อตรวจสอบความพร้อมใช้งาน สิ่งนี้จะนำไปสู่ ​​UnsatisfiedLinkError อีกครั้ง

person Community    schedule 14.02.2013    source แหล่งที่มา


คำตอบ (1)


โฆษณา 3.) ก่อนอื่นเลย ฉันจะหลีกเลี่ยงการปล่อยให้บันเดิลโหลดไลบรารีระบบแบบสุ่ม บางทีคุณอาจจะแพ็คการจัดการไลบรารีระบบและการเข้าถึงทั้งหมดไว้ในชุดบริการก็ได้

ฉันยอมรับว่าการตรวจจับ ERROR ไม่เพียงแต่น่ากลัวเท่านั้น อาจไม่ใช่สิ่งที่เราควรทำเลย ข้อผิดพลาดคือข้อผิดพลาดของ VM และนั่นคือสิ่งที่มักจะนำไปสู่การรีสตาร์ท vm - หรือแอปพลิเคชันในกรณีของคุณ - เพื่อรับประกันการทำงานที่เสถียร

สำหรับฉันการตรวจสอบว่ามีไลบรารี่หรือไม่นั้นคล้ายคลึงกันในการตรวจสอบว่ามีทรัพยากรไฟล์อยู่หรือไม่ หากไลบรารีเป็นสิ่งที่มีไดนามิกมากในบริบทแอปพลิเคชันของคุณ คุณอาจให้ผู้ใช้เรียกดูไลบรารีและแจ้งให้แอปพลิเคชันทราบว่าไลบรารีนั้นอยู่ที่ไหน หากไม่มีสิ่งที่เหมือนกับผู้ใช้ คุณไม่สามารถค้นหาไฟล์ในเส้นทางของเครื่องไคลเอนต์ได้หรือไม่?

person gia    schedule 02.09.2013