【问题标题】:ktor android local http server throws errorktor android本地http服务器抛出错误
【发布时间】:2020-10-11 12:03:40
【问题描述】:

我做了什么?

  1. build.gradle下添加了依赖
implementation "io.ktor:ktor:1.3.2"
implementation "io.ktor:ktor-server-netty:1.3.2"
implementation "io.ktor:ktor-gson:1.3.2"
  1. AndroidMenifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
  1. MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        embeddedServer(Netty, 9000) {
            install(ContentNegotiation) {
                gson {}
            }
            routing {
                get("/") {
                    call.respond(mapOf("message" to "Hello world"))
                }
            }
        }.start(wait = true)
    }
}

出了什么问题?

在运行应用程序时,我收到以下错误并且 android 本地服务器未启动。

No implementation found for int io.netty.channel.kqueue.Native.sizeofKEvent() 
(tried Java_io_netty_channel_kqueue_Native_sizeofKEvent 
and Java_io_netty_channel_kqueue_Native_sizeofKEvent__)

No implementation found for int io.netty.channel.epoll.Native.offsetofEpollData() 
(tried Java_io_netty_channel_epoll_Native_offsetofEpollData 
and Java_io_netty_channel_epoll_Native_offsetofEpollData__)

【问题讨论】:

    标签: android kotlin localhost httpserver ktor


    【解决方案1】:

    Netty 的原生传输 doesn't support Android。您或许应该尝试其他 Ktor 引擎,例如 CIO 或 Jetty。

    【讨论】:

    【解决方案2】:

    我是如何解决的?

    1. build.gradle下添加了依赖
    implementation "io.ktor:ktor:1.3.2"
    implementation "io.ktor:ktor-server-jetty:1.3.2"
    implementation "io.ktor:ktor-gson:1.3.2"
    

    还有

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    defaultConfig {
        ...
        minSdkVersion 26
        ...
    }
    
    1. AndroidMenifest.xml
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    
    1. MainActivity.kt
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            embeddedServer(Jetty, 9000) {
                install(ContentNegotiation) {
                    gson {}
                }
                routing {
                    get("/") {
                        call.respond(mapOf("message" to "Hello world"))
                    }
                }
            }.start(wait = false)
        }
    }
    

    【讨论】:

    • 这里的具体变化是什么?我也看到了同样的错误......但如果我尝试 Jetty,我会得到一个不同的
    • 收到“NoClassDefFoundError:解析失败:Ljavax/naming/ldap/LdapName;”如果我使用码头
    • 对我来说是Jetty 让警告消失了。顺便说一句,使用 Netty 时它仍在处理该消息。
    【解决方案3】:

    我遇到了同样的问题。变化:

    start(wait = true)
    

    收件人:

    start(wait = false)
    

    Ktor 服务器应该在 Android 上启动并运行。

    【讨论】:

    • 这对我也有用,在 minSdkVersion 25io.ktor:ktor-server-netty:1.5.2 上开发。 CIO 也可以,但 Jetty 无法编译,因为它需要 minSdkVersion 26
    • 作为旁注,我必须补充一点,实际上服务器即使使用wait = true 也可以工作,并按预期处理请求。但是,Android 应用程序的其余部分将完全冻结并无法使用。
    【解决方案4】:

    如果您深入了解ktor 包中的源代码。你会发现错误只是一个冗长的消息,表明如果它没有找到依赖于操作系统的本机事件循环实现:kqueue、epoll,它将回退到使用内部实现:nioEventLoop。忽略它是安全的。

    https://github.com/ktorio/ktor/blob/40bb2a4829a6ad05fd5337f10bea7bf92f1a5fc2/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationEngine.kt#L220

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 2020-12-02
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多