this.httpServer = HttpServer.create(new InetSocketAddress(host, port), 0);

import com.sun.net.httpserver.HttpServer;

这种写在 IDEA 里面正常用的代码,在 Android Studio 提示没有,那 Android 的 JDK 铁定是阉割版的了,这种应该怎么办呢?

其实我的问题不是找一个 http server 库,而是想问怎样才能让 Android 用上非阉割版的 java ,这样很多库就可以直接搬了

不知道有人会不会也想折腾这个 HttpServer 包,如果有的话,可以附上一点资源:
rt.jar 文件在哪儿:在 jdk/jre/lib/rt.jar ,然后这个 rt.jar 大小在 60MB 以上
[1] docs.oracle.com/javase/7/docs/technotes/tools/solaris/jdkfiles.html
rt.jar 实测 jdk1.7 和 jdk1.8 都有,且在同一个路径,其它没有测试,这是 jdk1.7 的下载链接
[2] www.oracle.com/tw/java/technologies/javase/javase7-archive-downloads.html

会遇到的问题,desugarDebugFileDependencies 这个任务中失败,叫你把 minSDK 弄到 26 及以上。
改了之后能运行也不报错。但是这我第二次依然没有成功,这次是输入地址后没有任何效果,地址端口均正确,显示:“无法访问此网站 192.168.0.100 拒绝了我们的连接请求。”

我不是安卓开发,只能说没有提示的话,你先写了,看看能不能在模拟器上启动 server ,启动不了就是阉割了。阉割了就只能用安卓 sdk 里面有的方式去做,或者用第三方的库

反射大法试一下 获取不到 class 就换别的方式吧

这很难吗: letmegooglethat.com/?q=android+http+server+library

这种库实在太多以至于我不知道先给你推荐哪个……我用得最多的是 github.com/ktorio/ktor

com.sun 开头的类是 JDK 的内部实现,不是 Java 官方 API 的一部分, 安卓中没有 HttpServer 这个类, 安卓的网络编程与标准 Java SE 的实现不同,要使用更适合移动应用的库。

你之前的回答说深入过 Android 应用层,我感觉有点水啊。
一是你不知道 Android 的 Java 就是阉割版(以至于都有脱糖库这种东西存在),二是 Google 都不用就来问。

谢谢你抓我,可以让我更好的反思自己。另外,这个我显然是知道才发出来的,java 确实有很多版本,但我确实没有和别人交流过这件事情,因为我多次想将一些 java lib 直接考到 Android 项目中用,都会报各种错误。

所以我的问题来了,应该怎么办呢?自己写一个吗,有没有办法就是使用到非阉割版的 java 呢在 Android 里呢?

是所谓的阉割版,包括你用的 c 库都是重新实现的(bionic)。

bionic 是出于轻量化考虑。

java 应该是轻量化+规避版权风险(不知道前期是否考虑过),版权风险具体可以参考甲骨文跟 google 那场关于 api 算不算侵权的官司。

建议是不要生搬硬套,你猜猜 android 开发跟 java 开发为什么 jd 区别不小?

这个问题 google 下都有大把答案吧。找个 android 用的 http server 的实现呗。

谢谢你的回答。我认为 jd 区别不小的原因是 Android 有一个 Framework 层(各种框架服务)通过 SDK 提供了很多 API ,以及各个 android 版本会有改动,开发者需要去了解,需要多看文档多读源码以及多实践,而 java 程序员就是纯面向 Java 了,once write ,run anywhere 。看你说的,可能真的没有办法在 Android 中使用非阉割版的 java 了,其实如果支持,Android 程序员会爽很多。我有这个问题,是因为我在写一个 http server ,当然这个不难,就是解析 http 文本返回数据,当然最主要是因为我需求很简单,然后之前用 IDEA 写好了代码搬不到 Android 去,现在又在重新写,真的挺烦的因为完全是重复的

Android 的 Java 类库基于 Java SE ,但针对移动设备进行了大量定制和优化,移除了部分不常用的功能,增加了移动开发所需的 API 。因此,Android 开发与 Java SE 开发在类库和工具上有显著差异。

用 nanohttpd

这东西也不在 Java SE 里,哪里说得上是阉割呢。

#7 这个比较困难,至少做成应用打包的话不太好实现。如果是仅部署,我目前唯一能想到的方案是安装 Termux ,然后在这上面按照正常 linux 发行版那样安装 java 。

你如果是想复制粘贴,不如试试让 ai 帮你写平替代码,如果只是重新写但不熟悉 Android 的对应库,我觉得没所谓,就算是重新实现的库,其实也大差不差,了解下很快的吧

Android SDK 不是 Java SDK ,两个根本就不是一个东西,所以也不存在什么阉割。

ktor +1
Android 上 http server 实现应该一找一大把吧?

怎样才能让 Android 用上非阉割版的 java

首先,Java 标准是分得很碎的,至少有 Java SE API 和 JDK API 两部分[1]。Java SE 保证在所有完整的 Java 实现中存在,但 JDK 只是可选。你说的 com.sun.net.httpserver.HttpServer 属于 jdk.httpserver 模块[2],所以甚至都不属于 Java SE ,而是 JDK 这个可选规范的一部分。

然后,Android 用的根本不是标准 JVM ,各种 Java 8 、11+ API 都是脱糖实现的[3],所以塞不进额外模块是理所当然的。先不说这些模块的实现可能依赖额外语言功能,光是有 JNI/JNA 就足够喝一壶了。这些平台下的最优解就是换用对应的库,不要想着沿用原来的写法了。

当然如果你钻牛角尖说「我就是要用 com.sun.net.httpserver.HttpServer ,别的库用了我晚上睡不着」,这里[4]也有人试过直接把 runtime 打包塞进 APK 里,至少 HttpServer 看起来能工作。

[1] docs.oracle.com/en/java/javase/23/docs/api/index.html
[2] docs.oracle.com/en/java/javase/23/docs/api/jdk.httpserver/module-summary.html
[3] developer.android.com/studio/write/java11-default-support-table
[4] stackoverflow.com/a/70486739

谷歌当时是和 SUN 关系好,JVM 应该是重写过的,规避版权之类的, 就拿来用了. 后面被甲骨文收了可就关系不咋样了, 这么多年发展下来.. 建议去看安卓开发吧...

#18 回答很好,然后[4]那个我早先试过,运行没成功