我有以下情况:一个C++服务器应用程序正在监听传入的客户端连接。每次客户端连接尝试都会生成一个新的会话。该会话将调用特定服务,具体取决于从客户端提供的序列化数据中提供的服务ID。一旦服务返回结果,会话将向客户端发送数据。
情况的陷阱在于,该服务是用Java实现的。
因此我的问题是:
1.如果收到新的客户端请求,如何使用C++的VM引用来实例化和调用Java服务类?
我知道我需要一个Java VM来做到这一点。由于C++服务器类将首先通过SWIG生成的包装器从Java应用程序中调用,因此我想我可以将此应用程序的VM引用传递给我的服务器类(以及随后的会话)。
但是:
2.如何在我的Java代码中获取对当前VM的引用?
通常,在启动服务器后,Java应用程序将什么也不做。也许我必须保持它处于空闲状态以保持VM引用活动?除了服务内部的正常并发处理之外,是否有任何特殊的问题需要考虑关于C++和Java交互中的并发调用?
我已经看过这个问题,但必须承认解决方案很难理解,而且不清楚提问者试图实现什么。在这篇文章中,作者正在使用Java内置类型进行类似的操作,但似乎代码生成器不能用于自己的Java类型。我也知道可以生成新的VM来完成工作,但如果可能的话,我想使用现有的VM。
情况的陷阱在于,该服务是用Java实现的。
因此我的问题是:
1.如果收到新的客户端请求,如何使用C++的VM引用来实例化和调用Java服务类?
我知道我需要一个Java VM来做到这一点。由于C++服务器类将首先通过SWIG生成的包装器从Java应用程序中调用,因此我想我可以将此应用程序的VM引用传递给我的服务器类(以及随后的会话)。
但是:
2.如何在我的Java代码中获取对当前VM的引用?
通常,在启动服务器后,Java应用程序将什么也不做。也许我必须保持它处于空闲状态以保持VM引用活动?除了服务内部的正常并发处理之外,是否有任何特殊的问题需要考虑关于C++和Java交互中的并发调用?
例子:
//Java Service
public class JMyService{
public String loadContactInformation(int userid){
return "test";
}
}
//C++ (very simplified)
class Session{
public:
//[...]
void handleWrite(){
vm = getVMReference(); //is saved beforehand
if(serviceId == CONTACT_INFO){
//todo call JMyService.loadContactInformation
}
}
}
我已经看过这个问题,但必须承认解决方案很难理解,而且不清楚提问者试图实现什么。在这篇文章中,作者正在使用Java内置类型进行类似的操作,但似乎代码生成器不能用于自己的Java类型。我也知道可以生成新的VM来完成工作,但如果可能的话,我想使用现有的VM。
对于问题1,我不确定,但也许可以使用 jint JNI_OnLoad(JavaVM *vm, void *reserved);
方法在使用C++服务器类加载库时获取指向VM的指针。不幸的是,Oracle文档没有解释这个问题。是否有人有相关经验可以提供帮助?