如何使用 SWIG 将 C 结构中的 sockaddr_in 映射到 Java
我有一个 C 函数,我想通过 SWIG 使用 Java 调用它,但我不确定如何处理 C 结构中的 sockaddr_。有人有关于如何处理 sockaddr_in 的任何例子吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我有一个 C 函数,我想通过 SWIG 使用 Java 调用它,但我不确定如何处理 C 结构中的 sockaddr_。有人有关于如何处理 sockaddr_in 的任何例子吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
我确信有更好的答案,我期待看到它。但这似乎最初是有效的。
在你的 module.i 中:
I'm sure there's a better answer, and I look forward to seeing it. But this seems to work initially.
In your module.i:
实际上,swig.orgsockaddr_in 的文章>,虽然现在看起来有些旧了。
基本上,他们所做的就是编写一个函数,为您创建一个新的
sockaddr_in
,并采用需要填充的值作为在 Java 中易于传递的参数。这是链接文章的稍微更新和修剪的版本:不过,有一种更好的方法可以用 SWIG 包装它,我们可以编写一个类型映射来使用
java.net.InetSocketAddress
来代替,这会感觉更方便接口的 Java 端的“自然”:基本上,这会调用 getAddress() 和
getPort()
方法href="http://download.oracle.com/javase/1,5.0/docs/api/java/net/InetSocketAddress.html" rel="nofollow">java.net.InetSocketAddress
< /a> 并使用结果为调用创建一个 struct sockaddr_in 。注意:
InetSocketAddress
以查看它是哪个子类在类型映射本身中。out
类型映射。这基本上是相反的过程,JNI 代码将为我们创建新的 Java 对象。为了完整起见,还有第三种可能的方法来包装它,它不涉及 JNI,但编写一些 Java 代码。我们所做的是让 SWIG 包装
struct sockaddr
(如第一个示例所示),但随后让使用sockaddr
的包装函数返回java.net.InetSocketAddress< /code> 仍然对象并提供一些用于在两者之间进行转换的代码。我将给出一个带有“out”类型映射的示例,即从函数返回。
给定:
我们可以用以下方式包装它:
我们已经指定了如何直接包装
sockaddr_in
,但也指示函数本身的返回是更合适的 Java 类型 (%typemap(jstype )
) 并提供少量 Java 来执行转换 (%typemap(javaout)
)。我们也可以对 in 类型映射做类似的事情。这不能正确处理AF_INET6
地址 - 我找不到 IPv6 地址的InetAddress.getByAddress()
的等效项,因此可能应该有一个断言/异常那种情况。There's actually an article on wrapping
sockaddr_in
on swig.org, although it looks slightly old now.Basically what they did was write a function that creates a new
sockaddr_in
for you, taking arguments for the values that need to be filled in as things that are easy to pass around in Java. This is a slightly updated, trimmed version of the linked article:There's a nicer way of wrapping this with SWIG though, we can write a typemap to use
java.net.InetSocketAddress
instead, which will feel far more "natural" on the Java side of the interface:Basically this calls the
getAddress()
andgetPort()
methods ofjava.net.InetSocketAddress
and uses the result to create astruct sockaddr_in
for the call.Notes:
InetSocketAddress
to see which sub-class it is in the typemap itself.out
typemap. This is basically the reverse procedure, the JNI code will create new Java objects for us.For completeness there's also a third possible way of wrapping this, which involves no JNI, but writing a little bit of Java. What we do is have SWIG wrap the
struct sockaddr
as in the first example, but then have the wrapped functions that usesockaddr
return ajava.net.InetSocketAddress
object still and supply some code for converting between the two. I'll give an example with an "out" typemap, i.e. for returning from functions.Given:
we can wrap it with:
We've specified how to wrap a
sockaddr_in
directly, but also instructed the return from the function itself to be the more appropriate Java type (%typemap(jstype)
) and provided a small amount of Java to perform the conversion (%typemap(javaout)
). We could do similar for an in typemap too. This doesn't handleAF_INET6
addresses properly - I can't find an equivalent ofInetAddress.getByAddress()
for IPv6 addresses, so there should probably be an assert/exception for that case.