Android调用mongoose实现Web服务器

这篇博客介绍了如何在Android设备上使用mongoose创建本地Web服务器。通过在jni目录下放置必要的源文件并执行ndk-build,生成的可执行文件mongoose被推送到手机并执行。在Android 5.0及以上版本,由于PIE安全机制,需要特定编译选项才能运行。作者提供了两种在Java应用中调用mongoose的方法:一是通过Runtime.getRuntime().exec,二是利用JNI调用共享库。
摘要由CSDN通过智能技术生成

新建一个jni的文件夹,放入http_client.c mongoose.c mongoose.h Android.mk文件,Android.mk文件内容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE

LOCAL_MODULE    := mongoose
LOCAL_SRC_FILES := http_client.c mongoose.c

include $(BUILD_EXECUTABLE) #可执行文件
  • cd到该目录,执行ndk-build,会生成libs和obj两个文件夹,libs/armeabi/下会有可执行文件mongoose,将该文件push到手机的/data/local。
  • adb shell进入手机的/data/local目录,执行./mongoose即可。
  • 手机端访问127.0.0.1:8080即可访问到该网页

在Android 5.0及以后版本,若没有添加

LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE

会出现如下错误:

error: only position independent executables (PIE) are supported.

这是因为,PIE这个安全机制从4.1引入,Android 5.0之前的系统版本并不会去检验可执行文件是否基于PIE编译出的,因此不会报错。但是Android 5.0以后已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行。解决办法非常简单,在Android.mk中加入上面两个FLAG即可。

java中调用mongoose的方法
1. Executing mongoose from the Java application using Runtime.getRuntime().exec call
2. Building a shared library and calling its functions using JNI.

好的,我可以帮你回答这个问题。首先,你需要安装Mongoose web服务器。在Ubuntu终端中使用以下命令进行安装: ``` sudo apt-get update sudo apt-get install mongoose ``` 安装完成后,你可以使用以下代码在本地创建一个简单的网页聊天室: ```c #include "mongoose.h" static const char *s_http_port = "8000"; static struct mg_serve_http_opts s_http_server_opts; static void ev_handler(struct mg_connection *nc, int ev, void *p) { if (ev == MG_EV_HTTP_REQUEST) { mg_serve_http(nc, (struct http_message *) p, s_http_server_opts); } } int main(int argc, char *argv[]) { struct mg_mgr mgr; struct mg_connection *nc; mg_mgr_init(&mgr, NULL); nc = mg_bind(&mgr, s_http_port, ev_handler); if (nc == NULL) { printf("Failed to create listener\n"); return 1; } mg_set_protocol_http_websocket(nc); s_http_server_opts.document_root = "."; printf("Starting web server on port %s\n", s_http_port); while (1) { mg_mgr_poll(&mgr, 1000); } mg_mgr_free(&mgr); return 0; } ``` 上述代码会在本地的8000端口上启动Mongoose web服务器,并在当前目录下提供静态文件服务。 接下来,你需要编写一些JavaScript代码来实现网页聊天室功能。你可以使用WebSockets来实现实时通信。以下是一个简单的实例: ```javascript var socket = new WebSocket("ws://" + location.hostname + ":8000/chat"); socket.onopen = function() { console.log("Connected to server"); } socket.onmessage = function(event) { console.log("Received message: " + event.data); } socket.onclose = function() { console.log("Disconnected from server"); } function sendMessage() { var message = document.getElementById("message").value; socket.send(message); } ``` 在上述代码中,我们使用WebSocket API与服务器进行实时通信。当消息发送到服务器时,服务器会将消息广播给所有连接到聊天室的客户端。你需要在服务器端编写代码来处理这些消息并将它们广播到所有客户端。 希望这些信息能帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值