我为两个编译器管理 JNI 项目:MSVC ++ 8.0和9.0,我的CPP文件包含以下实现:extern“ c” {jniexport jlong​​ jnicall jnicall java_context_serviceprovidercontext_startserviceprovider(jnienv * env,jnienv * env,jclass,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 项目中到底是什么导致了这种行为?

有帮助吗?

解决方案

JNICALL 可能是 #define JNICALL __stdcall. 。更改调用约定将修复名称修饰,但它会严重(包括默默地)破坏 JNI,因为它将调用一个函数,假设 __stdcall 并得到其他东西。

难道真的不起作用吗?从我在谷歌上搜索到的信息看来,JVM 知道如何正确地修饰函数名称。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top