سؤال

لقد وجدت العديد من المراجع عبر الإنترنت (بما في ذلك بعضها على Stackoverflow) إلى JNA المستخدمة في مكتبات C ++، ولكن لا شيء يمكنني أن أجده في Docs JNA يشير إلى أنه ممكن. لا يبدو أن هناك أي طريقة لفئة C ++، على وجه الخصوص.

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

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

المحلول

ما يصل هذا السؤال إلى أن يسأل كيفية استدعاء أساليب مثيل C ++ باستخدام JNA, ، من الممكن، لكنك سيتعين عليك القيام ببعض الأعمال. على وجه الخصوص، ستحتاج إلى كتابة غلاف extern "C"أي وظائف تحتاجها فعليا لاستدعاءها.

لأي تعسفية type* function() التعريف يمكنك تعيين الطريقة باستخدام jna كما العودة com.sun.jna.Pointer, ، لكنك لن تتمكن من استدعاء الأساليب على كائن C ++ من JNA.

سيكون هناك حل بسيط لهذا هو كتابة مكتبة واجهة C تستثمر ببساطة الطريقة على الكائنات لك ... لذلك إذا كان لديك بعض وظيفة الأعضاء foo() يمكنك تصدير طريقة ج من رمز C ++ الخاص بك:

extern "C" void bar(type* var){
   var->foo();
}

من الواضح أن هذا سيضيف بعض العمل من أجلك ... لكنني أظن أن النفقات العامة للتبديل إلى jni. سيكون عن نفسه.

يهتم JNA فقط بالطريقة التي يتم فيها تصدير الطريقة في DLL - وهذا يجب أن يكون بدون ديكورات C ++ (وبالتالي extern "C")، حتى تتمكن من القيام بكل ما تحتاج إليه في أي طريقة من هذا القبيل دون كشف الأساليب التي تتصل بها.

في مثالتي المتعطلة أعلاه، وهذا يعني ذلك foo(), ، طالما أنه محدد داخل DLL لا يجب أن تتعرض في الواقع. نظرا لأنها وظيفة C ++، لا يمكن لجنة الإرهاب الاتصال به مباشرة، ولكن يمكن استدعائها من داخل دالة يمكن أن تسميه jna، وهذا هو السبب في أن حل الحل المقترح.

لذلك، نعم، يمكنك تغليف المكالمات بالكامل لجميع وظائف الأعضاء (إنشاء، تشغيل، تدمير) في وظيفة واحدة، لن يهتم JNA.

نصائح أخرى

محاولة جرعة كبيرة. وبعد سوف يخلق مغلفة لفئات C ++ بالنسبة لك.

بريدج هو طفل روحي من الجينات JNA تضيف بعض الدعم المحدود C ++ (+ الدعم الكامل من jnaerator). إذا كنت لا تستخدم العديد من القوالب، فقد تعمل فقط ...

(إخلاء المسؤولية: أنا مؤلف Bridj & Jnaerator)

Youre jna الصحيح هو لتسجيل المكتبات الأصلية. أعتقد أن ما تحتاجه هو جافا - كوم جسر. إذا كان الأمر كذلك، فهناك عدد قليل من البدائل المجانية:

جكم http://sourceforge.net/projects/jcom.

جاكوب http://sourceforge.net/projects/jacob-project.

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

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