استخدم مكتبات Windows Static من رمز Java بأقل جهد (يفضل استخدام JNA)

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

سؤال

لا بد لي من استخدام بعض مكتبة Windows الثابتة (*.lib) من كود Java ، يمكنني كتابة أغلفة C ++ JNI ، لكنني أفضل عدم القيام بذلك (ليس من ذوي الخبرة في C ++).

ما سيكون أسهل (أقل جهد تطوير) استخدامه ، والأداء ليس مهمًا ، لأن هذا الرمز سيحقق بعض البيانات ، والتي سيتم عملها بشكل كبير على جانب Java.

على الأرجح سأستخدمها JNA, ، لكن Afaik يحتاج إلى مكتبات ديناميكية ، ولدي مسابقة ثابتة.

أنا أيضاً طلب Question على تحويل المكتبات الثابتة إلى تلك الديناميكية.

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

المحلول

لما يستحق ، كان لدي مشروع مثل هذا الوقت. كان من السهل جدًا تلقائيًا من أغلفة JNI. أعتقد أن لدينا حوالي 350 صادرات وظيفية للالتفاف. استغرق الأمر منا حوالي 3 ساعات لتجميع البرنامج النصي لتشويه التلقائي للركبة (آسف ، لا تملك البرنامج النصي الذي يدور حوله مفيدة أو سأقوم بنشره).

لم يكتبنا أي رمز C ++ تقريبًا - لكن الأمر يتطلب فهم كيفية عمل JNI ... إنها في الواقع فرصة/مشروع تعليمي جيد جدًا - إذا كان لديك الوقت ، فلا تخاف من JNI - ستندهش من كيفية ذلك الكثير تتعرف عليه حول كيفية عمل JVM ...

إذا ذهبت إلى هذا الطريق ، أوصي بأن تحافظ على وظائف التفاف الخاصة بك حقًا ، خفيفة الوزن حقًا - حرفيًا لا توجد معالجة فيها على الإطلاق. ما عليك سوى تحويل الوسيطات اللازمة من قيم JNI إلى الأصلي (هذا مطلوب في الغالب للسلاسل) ، واتصل بوظيفتك الأصلية ، وتحويل النتائج مرة أخرى.

إذا كان لديك وظيفة تمر في مؤشر سلسلة وتتوقع أن تعود السلسلة إلى المؤشر ، فاستخدم مجموعة سلسلة بحجم 1 من جانب Java وملءها بالنتيجة من المكالمة الأصلية.

أو إذا كنت مضغوطًا للوقت ، فقم بتجميع .lib إلى .dll واستخدم JNA :-)

نصائح أخرى

يمكنك دائمًا إنشاء مشروع DLL (المكتبة الديناميكية) والذي يتصل مباشرة في مكتبتك الثابتة ، وبعد ذلك يمكنك استخدام JNA مع DLL الجديد.

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