جافا، System.loadlibrary ( "someDLLFile") يحصل على خطأ ارتباط unstatisfied

StackOverflow https://stackoverflow.com/questions/1029559

سؤال

وكنت قد كتبت بعض JNI السنانير إلى C ++ مكتبة وخلق بعض الملفات DLL لمشروع خادم جافا بلدي. دعونا نقول ملفات DLL وجرة هي في نفس المجلد تحت عنوان "C: / الخادم"

وأنا الوصول إلى هذه الملفات DLL باستخدام:

System.loadLibrary("someDLLFile");

وفي الفئة التي تحتاج رمز C ++.

والمشكلة أنا على التوالي في هو عند تشغيل هذا الخادم على آلة بلدي، كل شيء يعمل بشكل جيد بغض النظر عن مكان أضع المجلد "الخادم". ولكن عندما أعطيها إلى زميل له لاختبار، وأنها مستمرة على:

java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path

وأريد أن يكون لديك الملفات DLL يعيش في نفس المجلد مثل ملفات جرة ويفضل عدم وجود شخص تكوين المتغير PATH الخاصة بهم.

وماذا System.loadLibrary () العمل على الجهاز بلدي بغض النظر عن موقع المجلد، ولكن ليس على كمبيوتر آخر؟

هل كانت مفيدة؟

المحلول

وكان يعمل لأن DLL (أو DLL فإنه يعتمد على، أي MSVCR90.DLL أو شيء) هم في PATH على جهازك، ولكن ليس على الآخر.

وإما تعيين PATH الحياة الفطرية-فار أو الممتلكات java.library.path لاحتواء دير مع الملف الخاص بك، أو تخزين دلل الخاص بك حيث يجد جافا بشكل افتراضي (العديد من الخيارات هنا، اعتمادا على استراتيجية نشر ومنصة).

نصائح أخرى

وخيار واحد هو لتحديد الدليل في سطر الأوامر عند بدء تشغيل VM:

java -classpath C:\server -Djava.library.path=C:\server somePackage.Main

وثمة خيار آخر هو استخدام System.load بدلا من System.loadLibrary.

URL url = Test.class.getResource("someDLLFile.dll");
String f = new File(url.getFile()).getAbsolutePath();
System.load(f);

والجانب السلبي هو أن البرنامج يتم الآن التعامل مع أسماء الدليل التي تعتمد على منصة، ملحقات الملفات وما إلى ذلك.

ولست متأكدا إذا كان هذا هو مفيد أم لا، ولكن لقد تضمنت ما يلي في بعض المشاريع:

http://forums.sun.com/thread.jspa؟threadID=707176

لتحميل المكتبات المحلية.

وبعد ذلك فقط تحميل دليل بن

    String binPath = new File(".").getAbsolutePath() 
                     + System.getProperty("file.separator") + "bin";

   addDir( binPath );

وكان يعمل بشكل جيد جدا.

ولكن مرة أخرى، وأنا لست متأكدا مما إذا كان هذا هو الحال أم لا.

وحاول تنزيل تبعية Depends.exe لمعرفة ما إذا كان دلل يعتمد على دلس أخرى على النظام أم لا. إذا كان كذلك، ثم تحقق من آلة أخرى، سواء كانت هذه دلس موجودة أو ليس في المسار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top