我管理两个编译器的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项目到底是什么?
答案 0 :(得分:1)
JNICALL
可能是#define JNICALL __stdcall
。更改调用约定将修复名称修饰,但它将可怕地(包括静默地)破坏JNI,因为它将调用假定__stdcall
的函数并获得其他内容。
它真的不起作用吗?从我可以谷歌看来,JVM似乎知道如何正确地装饰功能名称。
答案 1 :(得分:0)
这是__stdcall调用约定;你需要__cdecl。也许尝试将__cdecl添加到函数的定义中?
或者,更改项目设置中的默认调用约定。