extern“C”在msvc ++ 9.0中没有任何效果

时间:2010-03-17 16:52:51

标签: c visual-c++ extern visual-c++-2008 name-decoration

我管理两个编译器的JNI项目:MSVC ++ 8.0和9.0, 我的cpp文件包含以下实现:     extern“C”{     JNIEXPORT jlong​​ JNICALL Java_context_ServiceProviderContext_StartServiceProvider       (JNIEnv * env,jclass,jstring jspath){ .....     }

在depends.exe实用程序的帮助下,我可以看到MSVC 8.0成功导出了预期的函数: Java_context_ServiceProviderContext_StartServiceProvider 但是在MSVC 9.0下进行编译会让我疯狂,它会像忽略外部“C”一样出口。 depends.exe告诉我: _Java_context_ServiceProviderContext_StartServiceProvider @ 12

是否有人知道导致此行为的9.0项目到底是什么?

2 个答案:

答案 0 :(得分:1)

JNICALL可能是#define JNICALL __stdcall。更改调用约定将修复名称修饰,但它将可怕地(包括静默地)破坏JNI,因为它将调用假定__stdcall的函数并获得其他内容。

它真的不起作用吗?从我可以谷歌看来,JVM似乎知道如何正确地装饰功能名称。

答案 1 :(得分:0)

这是__stdcall调用约定;你需要__cdecl。也许尝试将__cdecl添加到函数的定义中?

或者,更改项目设置中的默认调用约定。