我用一个JNIEXPORT函数编写visual c ++ dll,如下所示:
extern "C"
{
JNIEXPORT int JNICALL sum()
{
return 1;
}
}
我想在其他visual c ++ dll中调用此函数,如下所示:
typedef int(__stdcall *f_funci)();
HINSTANCE hGetProcIDDLL = LoadLibrary("C:/.../JNIdllTest.dll");
if (!hGetProcIDDLL) {
std::cout << "could not load the dynamic library" << std::endl;
return EXIT_FAILURE;
}
f_funci funci = (f_funci)GetProcAddress(hGetProcIDDLL, "sum");
if (!funci) {
std::cout << "could not locate the function" << std::endl;
return EXIT_FAILURE;
}
std::cout << "funci() returned " << funci() << std::endl;
return EXIT_SUCCESS;
但是当我运行它时会发生此错误
无法找到该功能
我该怎么办?
答案 0 :(得分:0)
看起来像你的&#34;总和&#34;函数不是真正从JNIdllTest.dll导出的。您可以通过以下方式查看从DLL导出的函数。在依赖walker中打开DLL:http://www.dependencywalker.com/。
所以下载它并检查导出视图是否具有sum函数,以及函数的名称是否只是简单的&#34; sum&#34;或者它是否以某种方式装饰。 (默认情况下,C ++会在函数名称中添加返回值和函数参数的类型)。
它不应该被装饰,因为你的功能在外部&#34; C&#34;阻止,但如果是,请确保函数声明也有extern&#34; C&#34;在它面前。
如果该函数确实没有从DLL导出,那么检查你对JNIEXPORT的定义是什么,并尝试使用&#34; __ declspec(dllexport)&#34;相反 - 请参阅https://msdn.microsoft.com/en-us/library/a90k134d.aspx。
答案 1 :(得分:0)