Java 为什么我不能叫C++;通过JVM通过DLL重写函数?
我有一个名为“CommonUtils.lib”的staic库。它还包括一个名为“Standardconverter”的类,该类继承不在静态库中的基类“Converter” 我有另一个静态库,名为“Utils.lib”。它保存由standardconverter类继承的基类“Converter”。此库链接到一个名为“Utils.DLL”的DLL,该DLL带有一个导出函数“SendToClient”。在SendToClient()函数中,它调用 “标准转换器”(CommonUtils.lib) “Utils.dll”是由java类通过JVM加载的,我的问题是我无法调用StandardConverter类的重写函数Java 为什么我不能叫C++;通过JVM通过DLL重写函数?,java,c++,Java,C++,我有一个名为“CommonUtils.lib”的staic库。它还包括一个名为“Standardconverter”的类,该类继承不在静态库中的基类“Converter” 我有另一个静态库,名为“Utils.lib”。它保存由standardconverter类继承的基类“Converter”。此库链接到一个名为“Utils.DLL”的DLL,该DLL带有一个导出函数“SendToClient”。在SendToClient()函数中,它调用 “标准转换器”(CommonUtils.lib) “U
// Utils.lib
class Converter
{
Public:
Converter();
~Converter();
virtual void SetAdditionalData();
}
// CommonUtils.lib
class StandardConverter:public Converter
{
Public:
StandardConverter();
~StandardConverter();
void SetAdditionalData();
}
// Utils.dll
//Exported function()
__declspec( dllexport) void __stdcall SendToClient()
{
Adaptor()->GetConverter()->SetAdditionalData();
}
//Server.exe
Converter *pConverter = new StandardConverter();
Adaptor()->SetConverter( pConverter );
在启动期间,服务器设置转换器类型。同一进程创建JVM,并在Java类内加载Utils.dll并调用导出的函数SendToClient()。但在这里,它调用基类函数,而不是调用StandardConverter()。我认为这是由于地址空间的不同。实际上StandardConverter对象是从process Server.exe初始化和设置的。但是JVM加载的dll不知道动态对象,它总是只加载基类函数?我的理解正确吗
有人能提出一些解决这个问题的方法,并在JVM?中调用标准转换器中的过函数,基本上只能调用来自同一C++编译器编译的代码的C++调用。您不能从其他任何地方获得该功能。这就是为什么Extn“C”的原因。“存在-以标准的方式做事,可以从其他地方使用-但你不能做任何花哨的C++东西。我发现了这个问题。问题在于从JVM实例化适配器类的静态实例。ADAPTOR实例在server.exe进程启动时实际初始化。但是静态实例在通过JVM加载的DLL中不可见。所以Adpator实例发生了重新初始化,导致服务器进程设置的标准转换器实例丢失。接下来我想知道为什么JVM的地址空间中没有visibe静态变量。期待您的建议来解决这个问题。提前谢谢。