سؤال

أدير مشروع JNI لكلا المترجمين:MSVC ++ 8.0 و 9.0 ، يحتوي ملف CPP الخاص بي على التنفيذ التالي:extern "c" {jniexport jlong ​​jnicall java_context_serviceprovidercontext_startServiceProvider (jnienv * env ، jclass ، jstring jspath) {.....}

بمساعدة الأداة المساعدةdependent.exe أستطيع أن أرى أن MSVC 8.0 يقوم بتصدير الوظيفة بنجاح كما هو متوقع: Java_context_ServiceProviderContext_StartServiceProviderلكن التجميع تحت MSVC 9.0 يجعلني أشعر بالجنون لأنه يصدر مثل تجاهل "C" الخارجي على الإطلاق.يظهر لي Depend.exe: _Java_context_ServiceProviderContext_StartServiceProvider@12

هل يعرف أحد ما بالضبط في مشروع 9.0 الذي يسبب هذا السلوك؟

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

المحلول

JNICALL ربما #define JNICALL __stdcall.سيؤدي تغيير اصطلاح الاستدعاء إلى إصلاح زخرفة الاسم، ولكنه سيؤدي بشكل رهيب (بما في ذلك بصمت) إلى كسر JNI، حيث سيتم استدعاء دالة بافتراض __stdcall والحصول على شيء آخر.

هل هو في الواقع لا يعمل؟مما أستطيع جوجل يبدو أن JVM يعرف كيفية تزيين أسماء الوظائف بشكل صحيح.

نصائح أخرى

هذا هو __stdcall اصطلاح الاتصال؛أنت بحاجة إلى __cdecl.ربما حاول إضافة __cdecl إلى تعريف وظيفتك؟

وبدلاً من ذلك، قم بتغيير اصطلاح الاستدعاء الافتراضي في إعدادات المشروع.

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