我正在编写一些使用jni的代码。我的目标平台是Windows。因此,我的jni函数必须使用stdcall调用约定,但Rust仅使用cdecl调用约定来导出函数。
我使用MinGW(可能很重要)
我写了2个函数:
#[no_mangle]
pub unsafe extern "C" fn exported_cmethod(env: &JNIEnv, obj: jobject, path: jstring) {
// Some jni staff
}
和
#[no_mangle]
pub unsafe extern "stdcall" fn exported_stdmethod(env: &JNIEnv, obj: jobject, path: jstring) {
// Some jni staff
}
然后我用dumpbin查看导出表
dumpbin /exports acc_check.dll | findstr exported
2094 82D 000014A0 exported_cmethod = __ZN4core3fmt5Write10write_char17h774b1da469bdbfa3E
因此您可以看到Rust导出了C方法,但没有导出stdcall方法
我做错了什么?
答案 0 :(得分:1)
所以我想出了解决此问题的方法。
我在MinGW上使用了gnu工具链,这是一个错误。我刚刚用Microsoft sdk下载了MSVC工具链,它解决了我的问题。