nanomsg使用记录--编译环境构建

1 简介

nanomsg是一个socket library,它提供了几种常见的通信模式,为了能使网络层快速、可扩展并且能易于使用。c版本的zeromq(c++)。
官方地址
github
文档地址

2 java版本环境构建

nanomsg的java库有两个 jnano和jnanomsg,其中jnano比较早的库,现在应该不维护了,jnanomsg支持Clojure and Java 。文档地址。

2.1 系统相关

window10,idea,通过 maven进行构建。

2.2 pom.xml配置



    clojars.org
    http://clojars.org/repo
 


            jnanomsg
            jnanomsg
            0.4.3

2.3 安装cmake

因为jnanomsg需要依赖nanomsg,所以需要编译c的环境了。先下载个cmake window版本下载页面 可以选msi一路下一步进行安装)。

2.4 下载nanomsg代码

git clone https://github.com/nanomsg/nanomsg.git  

2.5 使用cmake编译

01


image.png

注意这里的vs选择,如果你的jdk是64,则需要选的vs版本也得是64,默认对应的是32位。


image.png

选择完成后点击finish,如果选择的vs版本本地没有安装就会报错。


image.png

清除bin目录下的所有文件,重新打开cmake, 再重新走前三步重新编译。遇到如下可以直接忽略,点击generate


image.png

如果正常则可以在bin目录下找到nanomsg.sln,直接使用vs打开就可以了。


image.png

导航栏->生成->生成 ALL_BUILD。生成成功后可以在bin下的Release目录下可以看到(如果选的debug则在debug目录)nanomsg.lib和nanomsg.dll。

2.6 copy dll

接下来就是怎么把dll和lib让项目引用到了。通过下面的错误可以去查找jna相关的资料。有说放在当前运行java目录下,也有说c:/window32的,但是都不行 。再看了看报错(也就是not found in resource path后面的一大堆路径),发现可以放在项目->tagrget->classes下。就copy dll到该目录下

// 如果dll放的目录不对的话就会出现下面的错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'nanomsg': Native library (win32-x86-64/nanomsg.dll) not found in resource path(....)
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:277)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:403)
    at com.sun.jna.Native.register(Native.java:1529)
    at com.sun.jna.Native.register(Native.java:1252)
    at nanomsg.NativeLibrary.(NativeLibrary.java:30)
    at nanomsg.Nanomsg.getSymbols(Nanomsg.java:35)
    at nanomsg.Nanomsg.(Nanomsg.java:48)
    at nanomsg.Nanomsg$constants.(Nanomsg.java:51)
    at nanomsg.reqrep.RepSocket.(RepSocket.java:13)
    at nano.Rep.main(Rep.java:10)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

再次运行,还是报错,请检查cmake时候选择的平台是否和jdk是一个平台。我就是因为jdk为x6464,选的vs为visual studio 14 2015(其实为x86平台 )。删除项目重新cmake。在打开项目 默认就是x64了,再生成 ALL_BUILD就可以了。

Exception in thread "main" java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。

    at com.sun.jna.Native.open(Native Method)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:263)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:403)
    at com.sun.jna.Native.register(Native.java:1529)
    at com.sun.jna.Native.register(Native.java:1252)
    at nanomsg.NativeLibrary.(NativeLibrary.java:30)
    at nanomsg.Nanomsg.getSymbols(Nanomsg.java:35)
    at nanomsg.Nanomsg.(Nanomsg.java:48)
    at nanomsg.Nanomsg$constants.(Nanomsg.java:51)
    at nanomsg.reqrep.RepSocket.(RepSocket.java:13)
    at nano.Rep.main(Rep.java:10)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

2.7 测试代码

package nano;

import nanomsg.reqrep.RepSocket;

/**
 * Created by wenshao on 2018/3/25.
 */
public class Rep {
    public static void main(String[] args) {
        RepSocket sock = new RepSocket();
        sock.bind("tcp://*:6789");
        sock.setRecvTimeout(10000);
        while (true) {
            byte[] receivedData = sock.recvBytes();
            sock.send(receivedData);
        }

    }
}

你可能感兴趣的:(nanomsg使用记录--编译环境构建)