3

我为两个编译器管理 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 下编译让我抓狂,它的导出就像完全忽略extern "C" 一样。depends.exe 向我展示:_Java_context_ServiceProviderContext_StartServiceProvider@12

有谁知道 9.0 项目中究竟是什么导致了这种行为?

4

2 回答 2

1

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

它实际上不起作用吗?从我可以谷歌的内容来看,JVM 似乎知道如何正确装饰函数名称。

于 2010-03-17T17:04:21.533 回答
0

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

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

于 2010-03-17T16:56:13.000 回答