UnsatisfiedLinkError:الإجراء المحدد لا يمكن العثور عليها

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

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أكتب بعض JNI التعليمات البرمجية في C++ تسمى من الصغير على ويندوز XP.لقد كنت قادرا على بنجاح تشغيل البريمج يكون JNI مكتبة تحميل يسمى وحتى الذهاب أبعد من ذلك بعد ذلك استدعاء وظائف في أخرى DLLs.حصلت على هذا العامل من خلال إنشاء متغير بيئة PATH النظام ليشمل الدليل كل من دلس في.

إذن المشكلة هي أنني إضافة مكالمة أخرى يستخدم الخارجية الجديدة DLL, و فجأة عند تحميل المكتبة ، UnsatisfiedLinkError يتم طرح.الرسالة هي:'الإجراء المحدد لا يمكن العثور عليه'.هذا لا يبدو أن هناك مشكلة في عداد المفقودين تعتمد DLL, لأنه لا يمكن إزالة تعتمد DLL و الحصول على رسالة مختلفة عن التي تعتمد DLL مفقود.من ما كنت قادرا على العثور على شبكة الإنترنت ، ويبدو أن هذه الرسالة يعني أن الأم جافا تنفيذ وظيفة هو مفقود DLL, ولكن من الغريب أنه يعمل بشكل جيد دون هذا الجزء الضئيل من التعليمات البرمجية.

لا أحد يعرف ما يمكن أن يسبب هذا ؟ ما هي أنواع الأشياء التي يمكن أن تعطي 'الإجراء المحدد لا يمكن العثور على رسائل على UnsatisifedLinkError?

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

المحلول

كنت احسب المشكلة.كان هذا خبر.رسالة "الإجراء المحدد لم يتم العثور" على UnsatisfiedLinkError يشير إلى أن وظيفة في جذر dll أو في تعتمد dll لا يمكن العثور عليها.السبب الأكثر احتمالا من هذا في JNI الوضع هو أن الأم JNI وظيفة لا يتم تصدير بشكل صحيح.ولكن هذا على ما يبدو يمكن أن يحدث إذا تعتمد على تحميل DLL و DLL مفقود وظيفة مطلوب من قبل الأم.

على سبيل المثال لدينا مكتبة اسمه input.dll.DLL اجل البحث هو أن ننظر دائما في دليل التطبيق الأول و الطريق الدلائل الماضي.في الماضي, نحن دائما ركض التنفيذية من نفس الدليل كما input.dll.ومع ذلك ، هناك آخر input.dll في دليل نظام windows (الذي هو في منتصف ترتيب بحث DLL).لذلك عند تشغيل هذا من برنامج java, إذا لم تتضمن التعليمات البرمجية أعلاه في الصغير ، الذي يسبب input.dll تحميل, تحميل input.dll من دليل النظام.لأن لدينا رمز يتوقع وظائف معينة في input.dll والتي ليست هناك (لأنه مختلف DLL) وتحميل فشل مع رسالة خطأ حول المفقودين الإجراءات.ليس لأن JNI الوظائف يتم تصديرها من الخطأ ، ولكن لأن الخطأ تعتمد DLL تم تحميل وأنه لم يكن يتوقع وظائف في ذلك.

نصائح أخرى

وهناك فرصة أن DLL تم إنشاؤها باستخدام C ++ (بدلا من C). إلا إذا حرصت على القيام خارجي على الإجراء، وهذا هو السبب المحتمل واحد.

وحاول تصدير جميع وظائف من DLL. إذا تضمنت القائمة وظيفة الخاص بك، ثم كنت جيدة.

وعادة، عندما ربط مكتبات أخرى، تحتاج لربط ملف .LIB ذات الصلة. هذا يبدو وكأنه كنت لا الرجوع كافة الملفات ليب التي تحتاج إليها. تحقق ما لا ربط وتأكد من إضافة انها ليب إلى قائمة لرابط.

هل خلق DLL خارجي جديد باستخدام الإجراء JNI القياسية؟ أي، وذلك باستخدام javah وهكذا دواليك؟ إذا كان الأمر كذلك، ثم أنا لست متأكدا ما هو الخطأ.

إذا لم يكن كذلك، ثم الإجراء الذي تحاول الاتصال لم يتم تصديرها (كما ذكر anjanb). أنا على علم اتجاهين تصدير وظائف: قائمة الصادرات منفصلة ووضع العلامات وظائف محددة مع __declspec (dllexport)

.

لا يمكن الوصول إلى متغير في C ++ DLL من وC التطبيق لديها القليل من مزيد من المعلومات موضوع دلس.

وتجميع بك ج ++ التعليمات البرمجية في وضع التصحيح. ثم أدخل DebugBreak ()؛ بيان حيث كنت ترغب في بدء التصحيح. تشغيل التعليمات البرمجية جافا. عند مواجهة بيان DebugBreak () ستحصل على المنبثقة مع زر التصحيح على ذلك. انقر عليه. سوف ديف ستوديو فتح مع البرنامج في رمز الجهاز. خطوة أكثر مع المصحح مرتين، ويجب أن تكون قادرة على تخطي التعليمات البرمجية المصدر.

إذا كنت قد فعلت كل البرمجة المسألة في JNI الأدلة و الأمثلة ولكن لا يزال يمكنك الحصول على نفسه في عداد المفقودين الإجراء خطأ, يمكن أن تكون المشكلة في مسار متغير على الأرجح.هل الخطوات التالية وتشغيل مرة أخرى:

  1. تأكد حول تعيين JAVA_HOME متغير JDK المجلد(لا JRE لأن JRE لا تحتوي على jni رأس) على سبيل المثال:في بيئة متغير لوحة إعدادات تحديد فار:JAVA_HOME فال:C:\Program Files\Java\jdk1.7.0_11
  2. إضافة %JAVA_HOME%\bin إلى المتغير path

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

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