একটি জেএনআই প্রকল্পে কীভাবে একটি অসন্তুষ্ট লিঙ্কআরার (নির্ভরযোগ্য গ্রন্থাগারগুলি খুঁজে পাওয়া যায় না) ঠিক করবেন


86

আমি জাভা প্রকল্পে কাজ করছি যা জেএনআই ব্যবহার করে। জেএনআই একটি কাস্টম লাইব্রেরি কল করে যা আমি নিজে লিখেছি, আসুন mylib.dll বলুন এবং এটি একটি তৃতীয় পক্ষের লাইব্রেরি, libsndfile-1.dll এর উপর নির্ভর করে।

আমি যখন আমার প্রোগ্রামটি চালাচ্ছি তখন এটি ক্র্যাশ হয়ে যায়

java.lang.UnsatisfiedLinkError:  C:\...path...\mylib.dll: Can't find dependent libraries.

আমি এই সাইটটি (এবং অন্যদের) অনুসন্ধান করেছি এবং আমি বেশ কয়েকটি সংশোধন করার চেষ্টা করেছি:

  1. আমি নির্ভরতা ওয়াকার দৌড়েছি। ডিডাব্লু বেশ কয়েকটি সতর্কতা দিয়েছিল - যে দুটি লাইব্রেরি লাইবসন্ডফিল, এমপিআর.ডিএলএল এবং এসএলএলএইপিএইপিএলএলএর প্রয়োজনীয় "লাইব্রেরি অমীমাংসিত আমদানি" ছিল - তবে ডিডাব্লিউএফএইউ বলেন যে এসব সতর্কবাণী নিরাপদে উপেক্ষিত যেতে পারে।

  2. আমি এখানে প্রস্তাবিত অনুসারে পদ্ধতির নামগুলি mylib.dll এ স্থির করেছি । পদ্ধতির নামগুলি কোনওভাবেই সংকলক দ্বারা ম্যাংলড হয়ে গেছে, তবে আমি লিঙ্কার পতাকাগুলি যুক্ত করেছি এবং dll পদ্ধতির নামগুলি এখন আমার জনি শিরোনাম ফাইলের সাথে মেলে।

  3. আমি এই সমস্ত ডিএলএলগুলিকে একই ডিরেক্টরিতে রেখেছি - একই ডিরেক্টরি যা তাদের ডেকে আনে সেই জার হিসাবে - তারা সঠিক পথে রয়েছে তা নিশ্চিত করার জন্য।

কোন পাশা.

কারও কি ধারণা আছে কি হচ্ছে?

আমি ম্যাকবুক প্রোতে (সমান্তরাল হয়ে) ভিজ্যুয়াল স্টুডিও 2010 এ আমার উন্নয়ন করছি। আমি তোশিবা ল্যাপটপে উইন্ডোজ এক্সপিতে আমার পরীক্ষা চালিয়ে যাচ্ছি।


4
আপনি কি -Djava.library.path সেট করেছেন?
জোচেন বেডার্সডরফার

আমার আসলে নেই, কারণ আমি কমান্ড লাইন থেকে প্রোগ্রামটি চালু করছি না। আমি প্রসেসিংয়ের জন্য একটি লাইব্রেরি লিখছি (প্রসেসিং.আর), এবং প্রসেসিং আমার কোড চালু করার জন্য দায়ী। আমি রানটাইমের সময় জাভা লাইব্রেরির পাথটি পরীক্ষা করেছি, যদিও আমার ডিএলএলযুক্ত ফোল্ডারটি এতে রয়েছে।
ডিবি '

যেমনটি আমি বলেছি, সমস্ত ডিএলএল একই। ফোল্ডারে, আমার .jar ফাইলের পাশেই। সুতরাং আমি মনে করি না যে সমস্যাটি তারা পথে নেই। যা হোক ধন্যবাদ.
ডিবি '

7
উইন্ডোজে আমাদের কমান্ড লাইন অপশন বা পরিবেশের ভেরিয়েবলের সাথে কৌতুক না করে জাভাটি স্বয়ংক্রিয়ভাবে দেখার জন্য [জেআরই] directory বিন ডিরেক্টরিতে (একই জায়গায় যেখানে জাভা.এক্সে ইত্যাদি রয়েছে) .dll ফাইল রাখতে হয়েছিল।
কোয়ান্টামমেকানিক

4
হুম ... ঠিক আছে, আমি আমার সমস্ত .dll [জেআরই] \ বিনে রাখার চেষ্টা করেছি। এইটা কাজ করে!
ডিবি '

উত্তর:


52

আমি পুরোপুরি নিশ্চিত যে ক্লাসপাথ এবং ভাগ করা লাইব্রেরি অনুসন্ধানের পথের একে অপরের সাথে খুব কম সম্পর্ক রয়েছে। জেএনআই বুক অনুসারে (যা স্বীকারোক্তিপূর্ণভাবে পুরানো) উইন্ডোজে আপনি যদি java.library.pathসিস্টেমের সম্পত্তিটি ব্যবহার না করেন তবে ডিএলএল বর্তমান চলমান ডিরেক্টরিতে বা উইন্ডোজ PATHএনভায়রনমেন্ট ভেরিয়েবলের তালিকাভুক্ত ডিরেক্টরিতে থাকতে হবে ।


হালনাগাদ:

দেখে মনে হচ্ছে ওরাকল তার ওয়েবসাইট থেকে পিডিএফ সরিয়েছে। টেক্সাস বিশ্ববিদ্যালয়ের আর্লিংটন - এ পিডিএফ বসবাসের একটি উদাহরণের দিকে ইঙ্গিত করতে আমি উপরের লিঙ্কটি আপডেট করেছি।

এছাড়াও, আপনি জেএনআই স্পেসিফিকেশনের ওরাকল এর এইচটিএমএল সংস্করণও পড়তে পারেন । এটি জাভা ওয়েবসাইটের জাভা 8 বিভাগে বাস করে এবং তাই আশা করি কিছু সময়ের জন্য এটি হবে।


আপডেট 2:

কমপক্ষে জাভা 8-তে (আমি পূর্ববর্তী সংস্করণগুলি পরীক্ষা করে দেখিনি) আপনি করতে পারেন:

java -XshowSettings:properties -version

ভাগ করা লাইব্রেরি অনুসন্ধানের পথটি খুঁজে পেতে। java.library.pathসেই আউটপুটে সম্পত্তিটির মূল্য অনুসন্ধান করুন ।


4
হ্যাঁ, CLASSPATHমোটেই ব্যবহৃত হয় না। আমি নিশ্চিত না যে এটি cwdকোনওভাবেই ব্যবহৃত হয়েছিল। java.library.pathবা সহজভাবে PATHকাজ করবে। @ ডিবি ', এখন আপনি যে জায়গাটি পেয়েছেন তা ভুল
আর্নেস্ট ফ্রেডম্যান-হিল

অনেক অনেক ধন্যবাদ! আমি মনে করি যে এখানে সমস্যার একটি অংশ ছিল উইন্ডোজ PATH এনভায়রনমেন্ট ভেরিয়েবল, জাভা.লিবেরি.পাথ এবং জাভা ক্লাসস্প্যাথের মধ্যে আমার বিভ্রান্তি। এটি এখন আরও বোধগম্য।
ডিবি '

আপনি কীভাবে এই সমস্যার মধ্য দিয়ে কাটিয়ে উঠলেন দয়া করে ব্যাখ্যা করতে পারেন?
SL_User

4
@ এসএল_উজার আমি মনে করি আপনি যদি লাইব্রেরিগুলিকে পরিবেশ পরিবর্তনশীল "পাথ" -এ যুক্ত করেন এবং কমান্ড প্রম্পট বা টার্মিনাল পুনরায় চালু করেন তবে এটি ঠিক করা উচিত। জাভা ক্লাসপাথের নীচে জারগুলি এবং পাথের নীচে লাইব্রেরি অনুসন্ধান করে।
xxjjnn

4
: এই উত্তর উপর ভিত্তি করে, এটি আপডেট 2 জন্য যে কমান্ড মত দেখায় অন্তত জাভা 7 থেকে উপলব্ধ করা হয়েছে stackoverflow.com/a/8472139/901641
ArtOfWarfare

18

আমি এই আকর্ষণীয় কেসটি অবহিত করতে চাই, উপরের সমস্ত পদ্ধতি চেষ্টা করেও ত্রুটিটি এখনও আছে। আশ্চর্যের বিষয় এটি একটি উইন্ডোজ 7 কম্পিউটারে কাজ করে তবে উইন্ডোজ এক্সপি তে তা হয় না। তারপরে আমি নির্ভরতা ওয়াকার ব্যবহার করি এবং উইন্ডোজ এক্সপিতে আমার ডিএল প্রয়োজন হিসাবে ভিসি ++ রানটাইম নেই। এখানে ভিসি ++ রানটাইম প্যাকেজ ইনস্টল করার পরে এটি একটি কবজির মতো কাজ করে। যে বিষয়টি আমাকে বিরক্ত করেছিল তা হ'ল নির্ভর করে গ্রন্থাগারগুলি খুঁজে পাওয়া যায় না, যদিও স্বজ্ঞাতভাবে জেএনআই নির্ভর ডিএল আছে, তবে শেষ পর্যন্ত এটি জেএনআই নির্ভর ডিএলএর জন্য অন্য নির্ভরশীল ডিএল প্রয়োজন requires আশা করি এটা কাজে লাগবে.


4
এই ক্ষেত্রে বিভ্রান্তিকর হলেও বার্তাটি সঠিক। আমার কাছে ভিসি ++ রানটাইম দুটিই পরীক্ষার বাক্সে হারিয়েছে এবং লাইব্রেরিটি ডিবাগ মোডে সংকলিত হয়েছে ( অ- পূর্বস্বীকৃত ডিবাগ রানটাইমগুলির উপর নির্ভর করে )। নির্ভরতা ওয়াকার এটিকে খুঁজে বের করতে একটি দুর্দান্ত সহায়তা ছিল।
জনি বালুনি

jnetpcap- লাইব্রেরি ব্যবহার করে একই সমস্যা ছিল। নির্ভরতা winpcap আর মেশিনে ইনস্টল করা হয়নি এবং ব্যতিক্রম বার্তা বিভ্রান্তিকর ছিল
ব্ল্যাকফ্লেগ

আমি ভাবছি এটা আমার ক্ষেত্রে হতে পারে।
আই টাইগার

আজকাল, নির্ভরতা ওয়াকার সুন্দর "দাঁতে দীর্ঘ" হয়ে উঠছে। এটি কোনও সাম্প্রতিক উইন্ডোজ 10/64-বিট dll মোটেও খুলতে পারে নি, তাই কোন গ্রন্থাগারটি অনুপস্থিত তা এখনও আমার জানা নেই ... হুই।
মার্ক স্টোরার

15

আপনাকে আপনার জেএনআই লাইব্রেরি লোড করতে হবে।

সিস্টেম.লোডলিবারি জেভিএম পাথ ( বিন পাথ) থেকে ডিএলএল লোড করে।

আপনি যদি কোনও পাথ দিয়ে একটি স্পষ্টত ফাইল লোড করতে চান তবে System.load ব্যবহার করুন ()

এছাড়াও দেখুন: জাভাতে সিস্টেম.লোড () এবং সিস্টেম.লোডলিবারির মধ্যে পার্থক্য


5

দয়া করে আপনার লাইব্রেরির পথটি সঠিক কিনা তা যাচাই করুন। অবশ্যই, আপনি আপনার লাইব্রেরির পাথের পথটি পরীক্ষা করতে নিম্নলিখিত কোডগুলি ব্যবহার করতে পারেন: System.out.println(System.getProperty("java.library.path"));

জাভা অ্যাপ্লিকেশন চালু করার সময় আপনি java.library.path নিয়োগ করতে পারেন :

java -Djava.library.path=path ...

4

আপনি যদি একটি 64 বিট জেআরই দিয়ে আপনার dll এর 32 বিট সংস্করণটি লোড করেন তবে আপনার এই সমস্যাটি হতে পারে। এটা আমার মামলা ছিল।


এটি সম্ভবত আমার ক্ষেত্রেও হয়; যদি কেউ পরিচিত কাজের ক্ষেত্র সম্পর্কে সচেতন হয় তবে আমি আগ্রহী; একটি bit৪ বিট সংস্করণ লোড করা ব্যতীত, এই ক্ষেত্রে প্রক্রিয়াটি একটি ডেল নয় chromedriver.exe, ক্রোমের জন্য সেলেনিয়াম ড্রাইভার, যা আমি যতটা বলতে পারি কেবলমাত্র 32 বিট সংস্করণে আসে।
সান্টিবাইলার্স

4

এক্সি মেশিনে ইনস্টল করার সময় javacvএবং opencvইক্লিপসের সাথে সংমিশ্রণে অভিন্ন সমস্যা ছিল । দেখা গেল যে আমি নিম্নলিখিত ফাইলগুলি অনুপস্থিত:

  • msvcp100.dll
  • msvcr100.dll

এগুলি ইনস্টল হয়ে গেলে, প্রকল্পটি সংকলিত হয়ে ঠিক আছে।


আমি একই সমস্যাটি পেয়েছি যা "মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ ২০১০ এসপি 1 পুনরায় বিতরণযোগ্য প্যাকেজ (x86)" ইনস্টল করার পরে অদৃশ্য হয়ে গেছে
কিরিল মিখাইলভ

2
  • সংক্ষিপ্ত উত্তর: "নির্ভরযোগ্য লাইব্রেরিটি খুঁজে পাচ্ছেন না" ত্রুটির জন্য, আপনার $ PATH পরীক্ষা করুন (নীচে বুলেট পয়েন্ট # 3 এর সাথে মিল রয়েছে)
  • দীর্ঘ উত্তর:
    1. খাঁটি জাভা বিশ্ব: jvm ক্লাস ফাইলগুলি খুঁজতে "ক্লাসপাথ" ব্যবহার করে
    2. জেএনআই ওয়ার্ল্ড (জাভা / নেটিভ সীমানা): জেভিএম dlls খুঁজে পেতে "java.library.path" (যা AT PATH এর ডিফল্ট) ব্যবহার করে
    3. খাঁটি নেটিভ ওয়ার্ল্ড: নেটিভ কোড অন্যান্য dlls লোড করতে $ PATH ব্যবহার করে

2

আমি কিপসেফিতে কিছু বন্ধুদের একটি দুর্দান্ত নিবন্ধ পেয়েছি যা আমার একই কাজটি করেছিল। এটি আমার পক্ষে কাজ করেছে, তাই আশা করি এটি আপনাকেও সহায়তা করবে! আপনি আগ্রহী ( অ্যান্ড্রয়েডে নেটিভ লাইব্রেরিগুলি লোডিংয়ের ক্ষতিকারক ) বা কেবল ব্যবহার করতে চাইলে একটি পঠন করুন

compile 'com.getkeepsafe.relinker:relinker:1.2.3'

এবং প্রতিস্থাপন

System.loadLibrary("myLibrary");

সঙ্গে

ReLinker.loadLibrary(context, "mylibrary");

1

আমার ঠিক একই সমস্যা ছিল, এবং অবশেষে এটি সমাধান হয়েছিল was

আমি সমস্ত নির্ভরশীল ডিএলএলগুলিকে একই ফোল্ডারে রেখেছি যেখানে মাইলিব.ডিএল সংরক্ষণ করা হয়েছিল এবং এটি নিশ্চিত করেছিলাম যে জাভা কম্পাইলার এটি খুঁজে পেতে পারে (সংকলনের পথে যদি কোনও মাইলিব.ডিল না থাকে তবে সংকলনের সময় এটির প্রতিবেদন করার সময় ত্রুটি ঘটবে)। আপনার যে গুরুত্বপূর্ণ বিষয়টি লক্ষ্য করা দরকার তা হ'ল আপনার অবশ্যই নির্ভর করবে যে সমস্ত নির্ভরশীল লিবগুলি মাইলিব.ডিলের সাথে একই সংস্করণে রয়েছে, উদাহরণস্বরূপ যদি আপনার মাইলিব.ডিল প্রকাশের সংস্করণ হয় তবে আপনার সমস্ত নির্ভরশীল লিবারগুলির প্রকাশ সংস্করণটি সেখানেও রাখা উচিত ।

আশা করি এটি একই সমস্যার মুখোমুখি হওয়া অন্যদের সহায়তা করতে পারে।


1

আমার একই সমস্যা ছিল এবং আমি এখানে যা পোস্ট করা হয়েছে তা ঠিক করার জন্য সবকিছু চেষ্টা করেছি তবে কেউই আমার পক্ষে কাজ করেনি। আমার ক্ষেত্রে আমি সিএলউইনকে ডেলটি সংকলন করতে ব্যবহার করছি। দেখে মনে হচ্ছে যে JVM ভার্চুয়াল সাইগউইন পথে JRE DLL গুলি সন্ধান করার চেষ্টা করেছে। আমি জেআরই এর ডিএলএলগুলিতে সাইগউইনের ভার্চুয়াল ডিরেক্টরি পাথ যুক্ত করেছি এবং এটি এখন কাজ করে। আমি এরকম কিছু করেছি:

সেট পাঠ্যপথ = "/ সাইগড্রাইভ / সি / প্রোগ্রাম ফাইল / জাভা / জেডিকি 1.8.0_45";% पथ%


1

আমার পরিস্থিতিতে, আমি টেরক্যাট in-তে একটিগ্রহণের সংযোগকারী হয়ে জাভা ওয়েব পরিষেবা চালানোর চেষ্টা করছিলাম। আমি যখন আমার ল্যাপটপে টমক্যাট of-এর একটি ইভেন্টে যুদ্ধের ফাইলটি স্থাপন করেছি তখন অ্যাপটি ভালভাবে চলেছিল। অ্যাপ্লিকেশনটির জন্য "আইবিএম ডিবি 2 9.5" এর জন্য জেডিবিসি টাইপ 2 ড্রাইভারের প্রয়োজন। কিছু অদ্ভুত কারণে ইক্যিস্পের সংযোগকারীটি আইসিএম ডিবি 2 এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে পাথগুলি দেখতে বা ব্যবহার করতে পারেনি, আমার ল্যাপটপে জিসিসি ক্লায়েন্ট হিসাবে ইনস্টল হওয়া ডেল ফাইলগুলি পৌঁছাতে। ত্রুটি বার্তাটি বলেছিল যে এটি db2jcct2 dll ফাইলটি খুঁজে পেতে ব্যর্থ হয়েছে বা এটি dll ফাইলের জন্য নির্ভরযোগ্য লাইব্রেরিগুলি খুঁজে পেতে ব্যর্থ হয়েছিল। শেষ পর্যন্ত, আমি সংযোজকটি মুছে ফেলা এবং এটি পুনর্নির্মাণ করি। তারপরে এটি সঠিকভাবে কাজ করেছিল। আমি এই সমাধানটি এখানে ডকুমেন্টেশন হিসাবে যুক্ত করছি, কারণ আমি অন্য কোথাও এই নির্দিষ্ট সমাধানটি খুঁজে পেতে ব্যর্থ হয়েছি।


0

স্থির গ্রন্থাগার তৈরি আমার জন্য কাজ করে, সংকলন ব্যবহার করে g++ -static। এটি নির্মাণের সাথে নির্ভর করে পাঠাগারগুলিও বান্ডিল করে।


0

মাইক্রোসফ্ট ভিজ্যুয়াল সি ইনস্টল করা ++ এসপি 1 পুনরায় বিতরণযোগ্য এটি স্থির করে


0

ফোল্ডারে প্রয়োজনীয় dlls রাখুন এবং PATH পরিবেশ পরিবর্তনশীল মধ্যে ফোল্ডার পথ নির্ধারণ করুন। নিশ্চিত করুন যে আপডেট করা পরিবেশ PATH পরিবর্তনশীল প্রতিফলিত হয়েছে।


0

দুটি প্রকল্প অ্যান্ড্রয়েড প্রকল্পকে একটি প্রকল্প হিসাবে মার্জ করার পরে আমি ffmpeg লাইব্রেরিতে একই সমস্যার মুখোমুখি হয়েছি।

আসলে ffmpeg গ্রন্থাগারের দুটি ভিন্ন সংস্করণের কারণে ইস্যুটি পৌঁছেছিল তবে তারা মেমরিতে একই নামের সাথে লোড হয়েছিল। একটি লাইব্রেরি JNiLibs এ রাখা হয়েছিল এবং অন্যটি অন্য লাইব্রেরির ভিতরে ছিল মডিউল হিসাবে। আমি মডিউলটির কোডটি কেবল পাঠযোগ্য হিসাবে সংশোধন করতে সক্ষম হইনি তাই আমার নিজের কোডটিতে ব্যবহৃত কোডটির নামকরণ করেছি পাঠযোগ্য কোডটিতে এফএফপিজেগেমেরায় রাখলাম এবং এটিকে একই নাম দিয়ে স্মৃতিতে লোড করলাম

System.loadLibrary("ffmpegCamera");

এটি সমস্যার সমাধান করেছে এবং এখন গ্রন্থাগারের উভয় সংস্করণ মেমরিতে পৃথক নাম এবং প্রক্রিয়া আইডি লোড করার পাশাপাশি রয়েছে।


0

কল করার সময় System.loadLibrary(), জেভিএম নজর রাখবেjava.library.path আপনার নেটিভ লাইব্রেরির জন্য । তবে, যদি সেই নেটিভ লাইব্রেরি অন্যান্য নেটিভ লাইব্রেরির উপর নির্ভরশীলতা ঘোষণা করে, তবে অপারেটিং সিস্টেমটি সেই স্থানীয় গ্রন্থাগারের নির্ভরতা সন্ধানের দায়িত্ব দেওয়া হবে।

যেহেতু অপারেটিং সিস্টেমটির কোনও ধারণা নেই java.library.path, তাই এটি java.library.path- এ আপনি যে কোনও ডিরেক্টরি দেখেন তা দেখতে পাবে না। পরিবর্তে, এটি কেবল অপারেটিং সিস্টেমের PATH এনভায়রনমেন্ট ভেরিয়েবলের ডিরেক্টরিগুলি অনুসন্ধান করবে। স্থানীয় গ্রন্থাগার নির্ভরতা যদি কোনও অপারেটিং সিস্টেমের নেটিভ লাইব্রেরি হয় তবে এটি পুরোপুরি ঠিক আছে কারণ এটি PATH এ পাওয়া যাবে। তবে, যদি স্থানীয় গ্রন্থাগার নির্ভরতা হ'ল একটি স্থানীয় গ্রন্থাগার যা আপনি বা অন্য কেউ তৈরি করেছেন, তবে আপনি সেখানে না রাখলে এটি PATH এ পাওয়া যাবে না। এই আচরণটি অদ্ভুত, অপ্রত্যাশিত, এবং ভালভাবে নথিভুক্ত নয়, তবে এটি এখানে ওপেনজেডিকে ইস্যু ট্র্যাকারে নথিভুক্ত । আপনি হয়ত অন্য Stackoverflow উত্তর এই ব্যাখ্যা পুনর্বহাল, জানতে পারেন এখানে

সুতরাং, আপনার কাছে কয়েকটি বিকল্প রয়েছে। আপনি হয় প্রতিটি নির্ভরযোগ্য পাঠাগারটি সঠিক নির্ভরতা ক্রমে লোড করে ব্যবহার System.loadLibrary()করতে পারেন, বা আপনার স্থানীয় গ্রন্থাগারগুলি যে ডিরেক্টরিগুলি সঞ্চিত আছে সেগুলি অন্তর্ভুক্ত করার জন্য আপনি PATH পরিবর্তন করতে পারেন।


-2
  1. Http://tess4j.sourceforge.net/usage.html এ যান এবং ক্লিক করুনVisual C++ Redistributable for VS2012
  2. এটি ডাউনলোড করুন এবং চালান VSU_4\vcredist_x64.exeবা VSU_4\vcredist_x84.exeআপনার সিস্টেম কনফিগারেশন উপর নির্ভর করে
  3. আপনার অন্যান্য লাইব্রেরির সাথে ফোল্ডারের dllভিতরে আপনার ফাইলগুলি রাখুন lib(উদাঃ \lib\win32-x86\your dll files)।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.