ในระหว่างการพัฒนา Java บางครั้งเราได้ติดต่อกับห้องสมุดท้องถิ่นหลายแห่งดังนั้นเมื่อบรรจุภัณฑ์โครงการเราต้องเผชิญกับทางเลือก: ใส่ไฟล์ห้องสมุดพร้อมกับไฟล์ Jar ที่ห่อหุ้ม หรือห่อไฟล์ไลบรารีลงในขวด
มีข้อได้เปรียบในการเปิดตัวโครงการขนาดเล็กลงในขวด เวลานี้เราจะแบ่งปันวิธีการรวม JNI ไว้ในขวด
[แนวคิดการใช้งาน]
หลังจากบรรจุห้องสมุด JNI (DLL, ฯลฯ ) ลงในขวดเราไม่สามารถเข้าถึงได้ผ่านเส้นทางและการอ่านของไลบรารีขึ้นอยู่กับไฟล์ไลบรารีภายนอกที่มีชื่อที่สอดคล้องกันภายใต้ java.library.path เราต้องปล่อยมันจากแพ็คเกจ JAR ก่อนที่จะเรียก JNI ซึ่งคล้ายกับกระบวนการคัดลอกไฟล์
[เลือกตำแหน่งการปรับใช้]
java.library.Path ไม่ใช่ตำแหน่งที่แน่นอนและคุณสามารถพิมพ์ได้โดยใช้รหัสต่อไปนี้:
System.out.println (System.getProperty ("java.library.path"));
ตัวอย่างเช่นในคอมพิวเตอร์ของฉันผลลัพธ์คือ:
d:/ไฟล์โปรแกรม (x86)/java/jre7/bin; c:/windows/sun/java/bin; c:/windows/system32; c:/windows; d:/ไฟล์โปรแกรม (x86)/java/jre7/bin/client; d:/ไฟล์โปรแกรม (x86)/java/jre7/lib/i386; c:/ไฟล์โปรแกรม (x86)/nvidia Corporation/physx/common; c:/windows/system32; c:/windows; c:/windows/system32/wbem; c: /windows/system32/windowspowershell/v1.0/; e:/deve lop/jdk1.7.0_71/bin; e:/พัฒนา/git/cmd; e:/พัฒนา/git/bin; e: /develop/apache-maven-3.2.1/bin; e:/eclipse-java-luna-sr1-win32/eclipse;
เส้นทางที่แน่นอนจะเปลี่ยนไปเนื่องจากระบบที่แตกต่างกันดังนั้นที่นี่เราเลือกเส้นทางสัมพัทธ์ "." ซึ่งอยู่ในไดเรกทอรีโครงการ
[คลาสการปรับใช้ JNI]
นำเข้า java.io.file; นำเข้า java.io.fileoutputStream; นำเข้า java.io.Inputstream; นำเข้า java.util.Arrays; นำเข้า java.util.linkedList; นำเข้า java.util.list; นำเข้า Java.util.list; = ไบต์ใหม่ [1024]; แหล่งที่มา = ใหม่ LinkedList <String> (); // เพิ่มชื่อไฟล์ไลบรารีท้องถิ่นที่นี่คุณสามารถแก้ไขและอ่าน XML ภายนอกหรือแหล่งข้อมูลได้เล็กน้อย ("luajava-1.1.dll") ไฟล์ ("." + file.Sparator + sourcename); return f.exists ();} โมฆะสาธารณะ dodefaultdevelopment () {สำหรับ (สตริง s: แหล่งที่มา) {dodevelopment (s);}} public boolean dodevelopment file.Sparator + sourcename); if (! f.exists ()) {f.createnewfile (); system.out.println ("[jnidev]: inition jni เริ่มต้น:" + sourcename); null) {os.close (); return false;} arrays.fill (แคช, (byte) 0); int realread = is.read (แคช); ในขณะที่ (realread! = -1) {os.write (แคช, 0, realread); realread = is.read (cache);} os.close ();} catch (exception e) {system.out.println ("[jnidev]: ข้อผิดพลาดในการคัดลอก jni lib!"); {jnidevelopment deve = new Jnidevelopment (); deve.dodefaultDevelopment (); ลอง {system.loadLibrary ("luajava-1.1"); system.out.println ("ห้องสมุดในพื้นที่"จากนั้นเราวางไลบรารีท้องถิ่นไว้ใต้แพ็คเกจเดียวกับคลาสนี้:
[รันผลลัพธ์]
[JNIDEV]: ค่าเริ่มต้น JNI inition: luajava-1.1.dll
[JNIDEV]: ค่าเริ่มต้น JNI Inition: Libluajava-1.1.so
การโหลดห้องสมุดท้องถิ่นสำเร็จ
สรุป
ข้างต้นคือทั้งหมดที่เกี่ยวกับการสนทนาสั้น ๆ เกี่ยวกับบรรจุภัณฑ์ห้องสมุด JNI ลงในไฟล์ jar ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องกับ Java ในเว็บไซต์นี้ หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!