يعمل RXTX مع برامج التشغيل التي تعتمد على نظام التشغيل الذي يعمل عليه. يتم تزويد هذه برامج التشغيل بمكتبة RXTX وهي:
librxtxSerial.so
وlibrxtxParallel.so
للينكس.librxtxSerial.dll
وlibrxtxParallel.dll
للنوافذ.librxtxSerial.jnilib
لل ماك
هذا الرابط لديه التعليمات لتثبيت هذه برامج التشغيل بشكل صحيح وهذا السؤال: java.lang.unsatisfiedlinkerror: لا rxtxserial في java.library.path لديه عدة حلول لحل هذا النوع من الاستثناء.
ومع ذلك ، يفترض جميعهم أن لديك إمكانية الوصول إلى مسار ٪ java_home ٪ أو أنك تعرف أين توجد برامج التشغيل وهو أمر جيد إذا كنت تعمل على جهاز الكمبيوتر الخاص بك ولكن لا بأس إذا كنت بحاجة إلى توزيع التطبيق الخاص بك. إذا كان هذا هو الحال ، فما عليك سوى انسخ ملفات برنامج التشغيل في نفس المجلد حيث jar
وضعت. عليك أن ترى شيئًا كهذا لمعرفة أنه يعمل بشكل صحيح:
Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7
تحديث
لقد لاحظت مؤخرًا أن Linux لا يتضمن دليل العمل الحالي في java.library.path
منشأه. وبالتالي إذا قمت ببساطة بإضافة librxtxSerial.so
في مجلد التطبيق لا تزال تحصل عليها UnsatisfiedLinkError
. مرة أخرى ، يمكنك تعيين هذه الخاصية عند تشغيل التطبيق من خلال سطر الأوامر مثل هذا:
java -jar -Djava.library.path=/path/to/lib
أو يمكنك استخدام نهج الاختراق الموضح هنا: تعيين "java.library.path" برمجيا. هذا النهج غير آمن ولا أوصي به إذا كان لديك وصول لتنفيذ حلول آخر ، لكنني جربت هذا وهو يعمل:
String javaLibraryPath = System.getProperty("java.library.path");
if(!javaLibraryPath.contains(File.pathSeparator + "." + File.pathSeparator)){
StringBuilder sb = new StringBuilder(javaLibraryPath).append(File.pathSeparator).append(".");
// The line above appends "." (current directory) to the library path
// Of course 'rxtxSerial.so' must be placed in the current directory
System.setProperty("java.library.path", sb.toString());
try {
Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);// Setting this field to null will force a reevaluation of
// the library path as soon as loadLibrary() is called
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
ex.printStackTrace();
}
}