2017-03-04 57 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