ما هي أسهل طريقة لاستخدام كود مصدر C في تطبيق Java؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

لقد وجدت هذه المكتبة مفتوحة المصدر التي أريد استخدامها في تطبيق Java الخاص بي.المكتبة مكتوبة بلغة C وتم تطويرها تحت نظام Unix/Linux، وسيتم تشغيل تطبيقي على Windows.إنها مكتبة تحتوي في الغالب على وظائف رياضية، وبقدر ما أستطيع أن أقول إنها لا تستخدم أي شيء يعتمد على النظام الأساسي، فهي مجرد كود C أساسي للغاية.كما أنها ليست كبيرة جدًا، أقل من 5000 سطر.

ما هي أسهل طريقة لاستخدام المكتبة في طلبي؟أعلم أن هناك JNI، ولكن ذلك يتضمن العثور على مترجم لتجميع المكتبة ضمن Windows، وتحديث إطار عمل JNI، وكتابة التعليمات البرمجية، وما إلى ذلك.قابلة للتنفيذ، ولكن ليس بهذه السهولة.هل توجد طريقة أسهل؟نظرًا لصغر حجم المكتبة، فأنا أميل إلى ترجمتها إلى لغة Java.هل هناك أي أدوات يمكن أن تساعد في ذلك؟


يحرر

انتهى بي الأمر بترجمة جزء المكتبة الذي أحتاجه إلى Java.إنها تمثل حوالي 10% من المكتبة حتى الآن، على الرغم من أنها ستزداد بمرور الوقت.لغة C و Java متشابهتان إلى حد كبير، لذلك يستغرق الأمر بضع ساعات فقط.تكمن الصعوبة الرئيسية في إصلاح الأخطاء التي تظهر نتيجة أخطاء في الترجمة.

شكرا للجميع على مساعدتكم.بدت جميع الحلول المقترحة مثيرة للاهتمام وسأنظر فيها عندما أحتاج إلى الارتباط بمكتبات أكبر.بالنسبة لجزء صغير من كود C، كانت الترجمة اليدوية هي الحل الأبسط.

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

المحلول

من المحتمل أن يكون أفضل رهان هو الحصول على كتاب جيد (K&R:لغة البرمجة C) كوبًا من الشاي وابدأ في الترجمة!سأكون متشككًا بشأن الثقة في برنامج الترجمة، ففي أغلب الأحيان لا يكون المترجم الأفضل هو أنت!إذا قمت بذلك، فهذا يعني أن الأمر قد تم ولن تحتاج إلى الاستمرار في القيام بذلك مرة أخرى.قد تكون هناك بعض التعقيدات إذا كانت المكتبة مفتوحة المصدر، فسوف تحتاج إلى التحقق من الترخيص بعناية بشأن هذا الأمر.هناك نقطة أخرى يجب مراعاتها وهي أنه سيكون هناك دائمًا بعض عناصر المخاطرة والخطأ المحتمل في الترجمة، لذلك قد يكون من الضروري التفكير في كتابة بعض الاختبارات للتأكد من صحة الترجمة.

هل لا توجد وظائف Math مكافئة لـ JAVA؟

نظرًا لأنك تعلق بنفسك، فإن طريقة JNI ممكنة، أما بالنسبة لمترجم c، فربما يكون من الممكن استخدام "Bloodshead Dev-c++"، ولكنه يتطلب جهدًا كبيرًا لحوالي 5000 سطر.

نصائح أخرى

على ال مكتبة جافا جنو العلمية المشروع الذي استخدمته جرعة كبيرة لإنشاء فئات مجمع JNI حول مكتبات C.أداة رائعة، ويمكنها أيضًا إنشاء تعليمات برمجية مجمعة بعدة لغات بما في ذلك Python.ينصح به بشده.

سأقوم بتجميعه واستخدام JNA.

تقوم JNA (Java Native Access) بشكل أساسي في وقت التشغيل بما تقوم به JNI في وقت الترجمة ولا تحتاج إلى أي كود غير Java (وليس الكثير من Java أيضًا).

لا أعرف عن أدائها أو سهولة استخدامها في حالتك ولكني سأجربها.

هل أنت متأكد أنك تريد استخدام مكتبة C، حتى لو كانت صغيرة؟

بمجرد أن يصبح الإصدار 64 بت أكثر شيوعًا، ستحتاج إلى البدء في إنشاء/نشر الإصدارين 32 بت و64 بت من المكتبة أيضًا.واعتمادًا على شكل كود C، قد تحتاج أو لا تحتاج إلى تحديث الكود لجعله 64 بت.

إذا كانت مكتبة C بسيطة، فقد يكون من الأسهل نقل مكتبة C إلى Java خالصة وعدم الاضطرار إلى التعامل مع إنشاء/نشر مكتبة JNI ومكتبة C وكود Java.

حسنا، هناك AMPC.إنه مترجم C لأنظمة التشغيل Windows وMacOS X وLinux، يمكنه تجميع كود C إلى Java Byte Code (نوع الكود الذي يعمل على جهاز Java الظاهري).

AMPC

ومع ذلك، فهو تجاري ويكلف 199 دولارًا لكل ترخيص.أشك في أن هذا يؤتي ثماره بالنسبة لك؛) لا أعرف أي مترجم مجاني من هذا القبيل.

OTOH، Java وC متشابهة إلى حد كبير.ربما يمكنك إعادة بناء كود C إلى Java (يمكن استبدال البنيات بكائنات ذات متغيرات مثيل عامة) ويمكن عادةً ترجمة عمليات المؤشر إلى شيء آخر (عمليات المصفوفة على سبيل المثال).على الرغم من أنني أعتقد أنك لا تريد الاطلاع على 5000 سطر من التعليمات البرمجية، أليس كذلك؟

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

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

هل حاولت استخدام:

System.loadLibrary("mylibrary.dll");

لست متأكدًا مما إذا كان هذا سيعمل مع مكتبة C خالصة ولكن ربما يستحق المحاولة.:)

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