2017-03-04 93 views
0

我写的Visual C++的dll与如下一个JNIEXPORT功能:我怎么能说JNIEXPORT功能从DLL在其他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

看起来好像你的“sum”函数不是真的从JNIdllTest.dll中导出。您可以看到例如由DLL导出的函数。在依赖关系者中打开DLL:http://www.dependencywalker.com/

因此下载并检查exports视图是否具有sum函数,以及函数的名称是否只是普通的“sum”或者它是否以某种方式装饰。 (默认情况下,C++会向函数名添加返回值和函数参数的类型)。

它不应该被修饰,因为你的函数在extern“C”块内,但是如果是这样,请确保函数声明在它前面也有extern“C”。

如果函数确实没有从DLL中导出,那么请检查您的JNIEXPORT定义是什么,并尝试使用“__declspec(dllexport)”代替 - 请参阅https://msdn.microsoft.com/en-us/library/a90k134d.aspx

0

感谢萨米Sallinen的

所以下载,并检查出口查看有求和函数与否,和函数的名称是否只是普通的“总和”或是否以某种方式装饰。 (默认情况下,C++会向函数名添加返回值和函数参数的类型)。

enter image description here