如何将java.net.Socket传递给等待' BoostSocket.assign(tcp::v4(), nati
How to pass java.net.Socket to a C++ DLL function waiting for `BoostSocket.assign(tcp::v4(), nativeSocketFromJava);`
所以我想知道它是可能的,以及如何通过套接字从java到一些DLL库等待本机这个操作系统套接字?有人能举个例子吗?是否有可能使用org.apache.tomcat. jndi . socket ?
首先,我们需要获得java.net.Socket
的文件描述符。使用反射机制可以做到这一点。这个想法是在java.net.SocketImpl
上访问java.io.FileDescriptor
,然后获得一个本地套接字描述符。参见DualStackPlainSocketImpl.java
的代码片段(此方法也由Zoran Regvart在这里指出)。
static int getFd(JNIEnv *env, jobject sock)
{
JNIEnv e = *env;
jclass clazz;
jfieldID fid;
jobject impl;
jobject fdesc;
/* get the SocketImpl from the Socket */
if (!(clazz = e->GetObjectClass(env,sock)) ||
!(fid = e->GetFieldID(env,clazz,"impl","Ljava/net/SocketImpl;")) ||
!(impl = e->GetObjectField(env,sock,fid))) return -1;
/* get the FileDescriptor from the SocketImpl */
if (!(clazz = e->GetObjectClass(env,impl)) ||
!(fid = e->GetFieldID(env,clazz,"fd","Ljava/io/FileDescriptor;")) ||
!(fdesc = e->GetObjectField(env,impl,fid))) return -1;
/* get the fd from the FileDescriptor */
if (!(clazz = e->GetObjectClass(env,fdesc)) ||
!(fid = e->GetFieldID(env,clazz,"fd","I"))) return -1;
/* return the descriptor */
return e->GetIntField(env,fdesc,fid);
}
我也认为你是在谈论Boost。亚洲的TCP套接字。如果是这样,那么您必须使用assign
方法将本机套接字与Asio的套接字对象关联。
请注意,此解决方案可能不适用于某些Java实现,因为它使用的实现的内部细节不能保证保持不变。另外,确保没有并发性(即Java不会试图并行地从同一个套接字描述符中读取)等。换句话说,使用风险自负。
希望有帮助。好运!
相关文章:
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 集合上的输出迭代器:assign和increment迭代器
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- Vector, assign() function Undefined Behavior
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- Tensorflow C++ API assign variable value
- 'QML Connections: Cannot assign to non-existent Property'尽管情况正好相反
- 为什么 std::optional 不允许"move construct and copy assign only"类型的移动分配?
- 如何使用Windows API直接将进程"assign"到信号量?
- 为什么 std::string_view 没有 assign() 和 clear() 方法?
- 为什么 boost::assign::list_of 不适用于对字符串、矢量<string>><?
- C++ Firebase 分段错误,Linux,位于 std::string::assign 无法访问地址 0xf 处的
- 在 CMake for Visual Studio 2010 中定义宏"disallow copy and assign"
- 填充 std::d eque<std::vector<std::string>> with boost::assign::list_of
- 没有重载函数需要 2 个参数错误,并带有 boost::assign::list_of
- Segfault at string::assign
- Using boost::assign::list_of
- boost/assign.hpp 在 Xcode 6.3 中失败
- 如何将java.net.Socket传递给等待' BoostSocket.assign(tcp::v4(), nati