الوصول الأصلي Java لا يفعل C ++، أليس كذلك؟
-
19-09-2019 - |
سؤال
لقد وجدت العديد من المراجع عبر الإنترنت (بما في ذلك بعضها على 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 ++ بالنسبة لك.
Youre jna الصحيح هو لتسجيل المكتبات الأصلية. أعتقد أن ما تحتاجه هو جافا - كوم جسر. إذا كان الأمر كذلك، فهناك عدد قليل من البدائل المجانية:
جكم http://sourceforge.net/projects/jcom.
جاكوب http://sourceforge.net/projects/jacob-project.
لقد استخدمت يعقوب في تمريرة مع نتائج جيدة، لكنني أعتقد أنه قديم قليلا.