English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

نقاش بسيط حول كيفية ضم مكتبة JNI في ملف jar

در توسعه Java، گاهی اوقات با کتابخانه‌های محلی زیادی مواجه می‌شویم، بنابراین در هنگام بسته‌بندی پروژه، ما با یک انتخاب مواجه می‌شویم: یا فایل کتابخانه‌ها را با فایل jar بسته شده قرار دهیم؛ یا کتابخانه‌ها را در jar بسته‌بندی کنیم.

بسته‌بندی یک پروژه کوچک به یک jar دارای مزایای بسیاری است، در اینجا یک روش برای بسته‌بندی JNI در یک jar به اشتراک گذاشته خواهد شد.

[منطق اجرایی]

بعد از بسته‌بندی کتابخانه JNI (dll، so و غیره) در یک jar، نمی‌توانیم از طریق مسیر به آنها دسترسی پیدا کنیم، و خواندن کتابخانه‌ها به یک فایل کتابخانه خارجی با نام مطابقت دارد که در زیر مسیر java.library.path قرار دارد، ما تنها نیاز داریم که قبل از فراخوانی JNI آن را از بسته jar آزاد کنیم، این کار شبیه به فرآیند کپی کردن فایل است.

[部署位置的选择]}

java.library.path不是一个定定的位置,使用仠下代码可以打印出:

System.out.println(System.getProperty("java.library.path"));

如果在我的订电界上,结果是这样的:

D:\Program Files (x86)\Java\jre7\bin;C:\windows\Sun\Java\bin;C:\windows\system32;C:\windows;D:/ProgramFiles (x86)/Java/jre7/bin/client;D:/Program Files(x86)/Java/jre7/bin;D:/Program Files (x86)/Java/jre7/lib/i386;C:\Program Files(x86)\NVIDIA Corporation\PhysX\Common;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;E:\Develop\jdk1.7.0_71\bin;E:\Develop\Git\cmd;E:\Develop\Git\bin;E:\Develop\apache-maven-3.2.1\bin;E:\eclipse-java-luna-SR1-win32\eclipse;;.

第一经度路径会因为不同的系统而变化,因而在这里选择了“点”这个相对路径,也就是项目目录下。

[JNI部署类]

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class JNIDevelopment {
	byte[] cache;
	List<String> sources;
	public JNIDevelopment(){
		cache = new byte[1024];
		sources = new LinkedList<String>();
		//这里加入本地库文件名,也可以稍加修改读取一个外部xml或properties 
		sources.add("luajava-1.1.dll");
		sources.add("libluajava-1.1.so");
	}
	private Boolean sourceExist(String sourceName){
		File f = new File("." + File.separator + sourceName);
		return f.exists();
	}
	public void doDefaultDevelopment(){
		for (String s:sources){
			doDevelopment(s);
		}
	}
	public Boolean doDevelopment(String sourceName){
		if(sourceExist(sourceName)){
			return true;
		}
			try{
				File f = new File("." + File.separator + sourceName);
				if(!f.exists()){
					f.createNewFile();
					System.out.println("[JNIDEV]:DEFAULT JNI INITION:"+sourceName);
				}
				FileOutputStream os = new FileOutputStream(f);
				InputStream is = getClass().getResourceAsStream(sourceName);
				if(is == null){
					os.close();
					return false;
				}
				Arrays.fill(cache,(byte)0);
				int realRead = is.read(cache);
				while(realRead != -1){
					os.write(cache, 0, realRead);
					realRead = is.read(cache);
				}
				os.close();
			}
			catch(Exception e){
				System.out.println("[JNIDEV]:ERROR IN COPY JNI LIB!")
				e.printStackTrace();}
				return false;
			}
		}
		return true;
	}
	public static void main(String[] args) {
		JNIDevelopment deve = new JNIDevelopment();
		deve.doDefaultDevelopment();
		try{
			System.loadLibrary("luajava-1.1");
			System.out.println("تم تحميل المكتبة المحلية بنجاح");
		}
		catch(UnsatisfiedLinkError e){
			System.out.println("فشل تحميل المكتبة المحلية");
		}
	}
}

سيتم وضع المكتبة المحلية في نفس المجلد مع هذا الكائن:

[نتائج التنفيذ]

[JNIDEV]:DEFAULT JNI INITION:luajava-1.1.dll
[JNIDEV]:DEFAULT JNI INITION:libluajava-1.1.so
تم تحميل المكتبة المحلية بنجاح

النهاية

هذا هو محتوى المقال الكامل حول كيفية تعبئة مكتبة JNI في ملف jar، آمل أن يكون هذا مفيدًا لكم. يمكن للزوار المهتمين الرجوع إلى مواضيع أخرى ذات صلة بـ Java في هذا الموقع. إذا كان هناك أي نقاط ضعف، فلا تتردد في ترك تعليق. شكرًا لجميع الأصدقاء لدعم هذا الموقع!

بيان: محتوى هذا المقال تم جمعه من الإنترنت، حقوق النشر مملوكة للمالك الأصلي، تم جمع المحتوى من قبل المستخدمين على الإنترنت بتحميلهم بأنفسهم، لا يمتلك هذا الموقع حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل الموقع أي مسؤولية قانونية متعلقة بذلك. إذا وجدت محتوى يشتبه في حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (أثناء إرسال البريد الإلكتروني، يرجى استبدال '#' بـ '@') لتقديم الشكوى، مع تقديم الدليل ذات الصلة، وإذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.

أنت قد تحب