Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何让JeroMQ使用Android Studio?_Android_Android Studio_Networking_Zeromq_Jeromq - Fatal编程技术网

我如何让JeroMQ使用Android Studio?

我如何让JeroMQ使用Android Studio?,android,android-studio,networking,zeromq,jeromq,Android,Android Studio,Networking,Zeromq,Jeromq,我的过程: 安装IntelliJ 创建新项目 使用文件>项目结构>全局库>org.zeromq:JeroMQ:0.5.1添加JeroMQ 在src中创建以下java文件: publisher.java import org.zeromq.ZMQ; import org.zeromq.ZContext; import org.zeromq.SocketType; import java.util.concurrent.TimeUnit; public class publisher {

我的过程:

安装IntelliJ

创建新项目

使用文件>项目结构>全局库>org.zeromq:JeroMQ:0.5.1添加JeroMQ

在src中创建以下java文件:

publisher.java

import org.zeromq.ZMQ;
import org.zeromq.ZContext;
import org.zeromq.SocketType;
import java.util.concurrent.TimeUnit;

public class publisher {
    public static void main(String[] args) throws Exception
    {
        try (ZContext context = new ZContext()) {
            // Socket to talk to clients
            ZMQ.Socket socket = context.createSocket(SocketType.PUB);
            socket.bind("tcp://*:5559");
            System.out.println("starting loop");
            String message = "hello";
            while (!Thread.currentThread().isInterrupted()) {
                // Block until a message is received
                socket.send(message);

                // Print the message
                System.out.println(
                        "Sent: [" + message + "]"
                );
                TimeUnit.SECONDS.sleep(1);
            }
        }
    }
}
subscriber.java

import org.zeromq.ZMQ;
import org.zeromq.ZContext;
import org.zeromq.SocketType;

public class subscriber {
    public static void main(String[] args) throws Exception
    {
        try (ZContext context = new ZContext()) {
            // Socket to talk to clients
            ZMQ.Socket socket = context.createSocket(SocketType.SUB);
            socket.connect("tcp://127.0.0.1:5559");
            socket.subscribe("");
            System.out.println("starting loop");

            while (!Thread.currentThread().isInterrupted()) {
                // Block until a message is received
                String message = socket.recvStr(0);

                // Print the message
                System.out.println(
                        "Received: [" + message + "]"
                );
            }
        }
    }
}
package com.example.testttt;

import org.zeromq.ZMQ;
import org.zeromq.ZContext;
import org.zeromq.SocketType;

public class subscriber implements Runnable {

    @Override
    public void run()
    {
        try (ZContext context = new ZContext()) {
            // Socket to talk to clients
            ZMQ.Socket socket = context.createSocket(SocketType.SUB);
            socket.connect("tcp://10.0.2.2:5559");
            socket.subscribe("");
            System.out.println("starting loop");

            while (!Thread.currentThread().isInterrupted()) {
                // Block until a message is received
                String message = socket.recvStr(0);

                // Print the message
                System.out.println(
                        "Received: [" + message + "]"
                );
            }
        }
    }
}
运行publisher.java,然后运行subscriber.java(并发)。两者都有效

下载Android Studio(我的版本-3.5.2)

创建新项目(基本活动,API 28/Android 9.0只是为了简单起见)

修改项目设置:文件>项目结构>模块>(编译SDK版本29,构建工具版本29.0.2,源代码兼容性1.8,目标兼容性1.8)

使用构建>编辑库和依赖项>依赖项>应用程序>org.zerommq:JeroMQ:0.5.1添加JeroMQ

将以下类添加到app>java>(顶部文件夹):

subscriber.java

import org.zeromq.ZMQ;
import org.zeromq.ZContext;
import org.zeromq.SocketType;

public class subscriber {
    public static void main(String[] args) throws Exception
    {
        try (ZContext context = new ZContext()) {
            // Socket to talk to clients
            ZMQ.Socket socket = context.createSocket(SocketType.SUB);
            socket.connect("tcp://127.0.0.1:5559");
            socket.subscribe("");
            System.out.println("starting loop");

            while (!Thread.currentThread().isInterrupted()) {
                // Block until a message is received
                String message = socket.recvStr(0);

                // Print the message
                System.out.println(
                        "Received: [" + message + "]"
                );
            }
        }
    }
}
package com.example.testttt;

import org.zeromq.ZMQ;
import org.zeromq.ZContext;
import org.zeromq.SocketType;

public class subscriber implements Runnable {

    @Override
    public void run()
    {
        try (ZContext context = new ZContext()) {
            // Socket to talk to clients
            ZMQ.Socket socket = context.createSocket(SocketType.SUB);
            socket.connect("tcp://10.0.2.2:5559");
            socket.subscribe("");
            System.out.println("starting loop");

            while (!Thread.currentThread().isInterrupted()) {
                // Block until a message is received
                String message = socket.recvStr(0);

                // Print the message
                System.out.println(
                        "Received: [" + message + "]"
                );
            }
        }
    }
}
(注意:使用10.0.2.2连接到localhost,如下所示())

在MainActivity.java文件中编辑onCreate方法,如下所示:

package com.example.testttt;

import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        new Thread(new subscriber()).start();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
创建android虚拟设备(Pixel 2 API 28,x86)。开始吧

在PC上仍然运行publisher.java时,单击“调试应用程序”。此时会出现第一行打印的“启动循环”,但不会显示其他消息。大约一分钟后,出现以下错误(这不是完整输出,因为本文正文有限):

A/example.testtt:java\u vm\u ext.cc:542]JNI在应用程序中检测到错误:对空对象的字段操作:0x0
java_vm_ext.cc:542]正在调用GetIntField
来自void sun.nio.ch.FileDispatcherImpl.preClose0(java.io.FileDescriptor)的java\u vm\u ext.cc:542]
java_vm_ext.cc:542]“FinalizerDaemon”守护程序prio=5 tid=6 Runnable
java_vm_ext.cc:542]| group=“system”scont=0 dsCount=0 flags=0 obj=0x16400448 self=0xee1f8200
java_vm_ext.cc:542]| sysTid=4740 nice=4 cgrp=default sched=0/0 handle=0xd45a0970
java_vm_ext.cc:542]| state=R schedstat=(720319 0 12)utm=0 stm=0 core=0 HZ=100
java_vm_ext.cc:542]| stack=0xd449d000-0xd449f000 stackSize=1042KB
java_vm_ext.cc:542]|保持互斥量=“mutator lock”(共享保持)
java#u vm_ext.cc:542]本机:#00 pc 004152f6/system/lib/libart.so(art::DumpNativeStack(std:u 1::basic_ostream&,int,BacktraceMap*,char const*,art::ArtMethod*,void*,bool)+198)
java_vm_ext.cc:542]本机:#01 pc 0051048e/system/lib/libart.so(art::Thread::DumpStack(std:u 1::basic_ostream&,bool,BacktraceMap*,bool)const+382)
java_vm_ext.cc:542]本机:#02 pc 0050b743/system/lib/libart.so(art::Thread::Dump(std:u 1::basic_ostream&,bool,BacktraceMap*,bool)const+83)
java_vm_ext.cc:542]本机:#03 pc 0031a8b0/system/lib/libart.so(art::JavaVMExt::JniAbort(char const*,char const*)+1088)
java_vm_ext.cc:542]本机:#04 pc 0031ad21/system/lib/libart.so(art::JavaVMExt::JniAbortV(char const*,char const*,char*)+113)
A/example.testtt:java_vm_ext.cc:542]本机:#05 pc 000d60f7/system/lib/libart.so(art:(匿名名称空间)::ScopedCheck::AbortF(char const*,…)+71)
java#u vm_ext.cc:542]本机:#06 pc 000dc5b3/system/lib/libart.so(art:(匿名名称空间)::ScopedCheck::CheckFieldAccess(art::ScopedObjectAccess&,#jobject*,#jfieldID*,bool,art::Primitive::Type)+323)
java_vm_ext.cc:542]native:#07 pc 000dbcc0/system/lib/libart.so(art:(匿名名称空间)::CheckJNI::GetField(char const*,_JNIEnv*,_jobject*,_jfieldID*,bool,art::Primitive::Type)+1056)
java#u vm_ext.cc:542]本机:#08 pc 000c5c84/system/lib/libart.so(art:(匿名名称空间)::CheckJNI::GetIntField(_JNIEnv*,_jobject*,_jfieldID*)+68)
java_vm_ext.cc:542]本机:#09 pc 000168d/system/lib/libopenjdk.so(fdval+45)
java_vm_ext.cc:542]本机:#10 pc 000179f9/system/lib/libopenjdk.so(FileDispatcherImpl_preClose0+41)
java#u vm_ext.cc:542]本机:#11 pc 0011534a/system/framework/x86/boot.oat(偏移量114000)(java.lang.system.setErr0[duplicated]+170)
java_vm_ext.cc:542]本机:#12 pc 005f0d52/system/lib/libart.so(art_quick_invoke_static_stub+418)
java_vm_ext.cc:542]本机:#13 pc 000a30df/system/lib/libart.so(art::ArtMethod::Invoke(art::Thread*、unsigned int*、unsigned int、art::JValue*、char const*)+239)
java_vm_ext.cc:542]本机:#14 pc 0029bca2/system/lib/libart.so(art::解释器::ArtInterpreterToCompiledCodeBridge(art::Thread*,art::ArtMethod*,art::ShadowFrame*,unsigned short,art::JValue*)+338)
java#u vm_ext.cc:542]本机:#15 pc 00293e48/system/lib/libart.so(布尔艺术::解释器::DoCall(艺术::艺术方法*,艺术::线程*,艺术::阴影帧&,艺术::指令常量*,无符号短,艺术::JValue*)+1048)
java_vm_ext.cc:542]本机:#16 pc 002d75be/system/lib/libart.so(_zn3art11解释器8doInvokeilns_10invoketypee0elb0eebpns_6threaders_11ShadowFrameEPKNS_11指令集pns_6JValueE+158)
java_vm_ext.cc:542]本机:#17 pc 002d1001/system/lib/libart.so(void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::switchimplcpp*)+73761)
java_vm_ext.cc:542]本机:#18 pc 005f7762/system/lib/libart.so(ExecuteSwitchImplAsm+18)
java_vm_ext.cc:542]本机:#19 pc 0012b5c8/system/framework/boot.vdex(sun.nio.ch.DatagramDispatcher.preClose)
java_vm_ext.cc:542]本机:#20 pc 002661c9/system/lib/libart.so(_zn3art11解释器7executeepns_6ThreadERKNS_20CodeItemDataAccessorns_11ShadowFrameENS_6JValueEb.llvm.2093054539+521)
java_vm_ext.cc:542]本机:#21 pc 0026c79c/system/lib/libart.so(艺术::解释器::艺术interpretertotranslatorbridge(艺术::线程*,艺术::CodeItemDataAccessor常量&,艺术::阴影帧*,艺术::JValue*)+220)
java#u vm_ext.cc:542]本机:#22 pc 00293e2b/system/lib/libart.so(布尔艺术::解释器::DoCall(艺术::艺术方法*,艺术::线程*,艺术::阴影帧和,艺术::指令常量*,无符号短,艺术::JValue*)+1019)
java_vm_ext.cc:542]本机:#23 pc 002d44dd/system/lib/libart.so(_zn3art11解释器8doinvokeilns_10InvokeTypeE2ELb0EL