如何在其他c ++ dll中从dll调用JNIEXPORT函数

时间:2017-03-04 12:51:32

标签: c++ dll java-native-interface

我用一个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;

但是当我运行它时会发生此错误

  

无法找到该功能

我该怎么办?

2 个答案:

答案 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)

谢谢Sami Sallinen

  

所以下载它并检查导出视图是否具有sum函数,以及函数的名称是否只是简单的&#34; sum&#34;或者它是否以某种方式装饰。 (默认情况下,C ++会在函数名称中添加返回值和函数参数的类型)。

enter image description here