ليس لـ "C" الخارجي أي تأثير في msvc++ 9.0
-
20-09-2019 - |
سؤال
أدير مشروع 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 إلى تعريف وظيفتك؟
وبدلاً من ذلك، قم بتغيير اصطلاح الاستدعاء الافتراضي في إعدادات المشروع.