Android:编译libevent动态库并移植jni中,在Android AVD虚拟机上实现一个http服务器

libevent源码:libevent-2.1.8-stable
Android Studio版本:Android Studio Electric Eel | 2022.1.1 Patch 2
AVD虚拟机为x86.

https://developer.android.google.cn/studio/run/emulator-networking?hl=zh-cn#connecting

大体步骤:

1.在wsl中编译libevent-2.1.8-stable源码,
2.将编译后的libevent所有内容复制到JNI目录中,编译动态库的时候,有时需要.o文件
F:\AndroidStudioProjects\MyApplication2\JNI
3.在JNI中创建Android.mk, Application.mk两个文件,指定平台是x86。如果用到curl库,也需要用x86
4.在Window powershell中使用ndk-build指令编译动态库,包含libevent.so和jni用到的动态库。注意在编译的动态库的时候会出现大量未定义符合的错误,需要在Android.mk中增加一些.c文件。有时也需要将event-config.h一些不是目标机架构的功能给关掉。要根据编译的平台是x86还是armebi来确定。有些错误还需要修改libevent源码,中间搞得有些头大。哈哈
5.在android studio创建app工程,该工程包含app界面和java调用cpp代码的中间文件。最终在jni中调用cpp文件生成http server。
6.编译android studio工程文件,并运行虚拟机,从AVD的浏览器访问到libevent httpserver,最终可以看到AVD中的目录。

app界面只有一个button,点击后会运行app。
app运行log如下:
在这里插入图片描述
AVD浏览器:
在这里插入图片描述

下面是一些要注意的细节:

  1. 在app同级的build.gradle文件中设置: abiFilters “x86”
  2. 查找虚拟机ip地址,并设定服务器绑定ip为虚拟机的本地IP。
    PS F:\Android_Sdk\platform-tools> ./adb devices
    List of devices attached
    emulator-5554 device

PS F:\Android_Sdk\platform-tools> adb -s emulator-5554
Android Debug Bridge version 1.0.41
Version 34.0.1-9680074

PS F:\Android_Sdk\platform-tools> adb -s emulator-5554 shell
root@generic_x86:/ # getprop
[net.gprs.local-ip]: [10.0.2.15]

  1. 设置目录为手机的根目录“/”
    evhttp_set_gencb(http, send_document_cb, (void *) “/”);
    在手机的浏览器输入:
    http://10.0.2.15:7777
    可以看到手机中的文件:

  2. Android.mk文件如下:
    LOCAL_PATH := $(call my-dir)
    ################################for .a ################

include $(CLEAR_VARS)

#LOCAL_ARM_MODE := arm

LOCAL_MODULE := libevent

LIB_SRC := event.c
evthread.c
buffer.c
bufferevent.c
bufferevent_filter.c
bufferevent_pair.c
listener.c
bufferevent_ratelim.c
evmap.c
log.c
strlcpy.c
evutil.c
evutil_time.c
evutil_rand.c
select.c
poll.c
epoll.c
signal.c
event_tagging.c
http.c
evdns.c
evrpc.c
bufferevent_sock.c
evthread_pthread.c

LOCAL_SRC_FILES := $(LIB_SRC)

LOCAL_C_INCLUDES := $(LOCAL_PATH)
$(LOCAL_PATH)/include
$(LOCAL_PATH)/compat

LOCAL_CFLAGS += -static -fPIC

include $(BUILD_SHARED_LIBRARY)
##############################################################
include $(CLEAR_VARS)

libcurl.a

LOCAL_MODULE := libcurl
LOCAL_SRC_FILES := libcurl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

#libtestjni.so
LOCAL_MODULE := testjni

LOCAL_SRC_FILES := test.cpp cJSON.cpp login.cpp #$(LOCAL_PATH)/sample/http-server.c
LOCAL_SHARED_LIBRARIES := libevent
LOCAL_LDLIBS := -llog -lz
LOCAL_STATIC_LIBRARIES := libcurl
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/event2 $(LOCAL_PATH)/compat $(LOCAL_PATH)/include

include $(BUILD_SHARED_LIBRARY)

  1. Application.mk
    APP_STL := c++_static
    APP_CPPFLAGS := -frtti -std=c++11
    APP_ABI := x86
    #APP_ABI := armeabi-v7a x86

6.event-config.h
/* event2/event-config.h
*

  • This file was generated by autoconf when libevent was built, and post-
  • processed by Libevent so that its macros would have a uniform prefix.
  • DO NOT EDIT THIS FILE.
  • Do not rely on macros in this file existing in later versions.
    */

#ifndef EVENT2_EVENT_CONFIG_H_INCLUDED_
#define EVENT2_EVENT_CONFIG_H_INCLUDED_

/* config.h. Generated from config.h.in by configure. /
/
config.h.in. Generated from configure.ac by autoheader. */

/* Define if libevent should build without support for a debug mode /
/
#undef EVENT__DISABLE_DEBUG_MODE */

/* Define if libevent should not allow replacing the mm functions /
/
#undef EVENT__DISABLE_MM_REPLACEMENT */

/* Define if libevent should not be compiled with thread support /
/
#undef EVENT__DISABLE_THREAD_SUPPORT */

/* Define to 1 if you have the `accept4’ function. */
//#define EVENT__HAVE_ACCEPT4 1

/* Define to 1 if you have the arc4random' function. */ /* #undef EVENT__HAVE_ARC4RANDOM */ #define EVENT__HAVE_ARC4RANDOM /* Define to 1 if you have the arc4random_buf’ function. /
/
#undef EVENT__HAVE_ARC4RANDOM_BUF /
#define EVENT__HAVE_ARC4RANDOM_BUF
/
Define to 1 if you have the <arpa/inet.h> header file. */
#define EVENT__HAVE_ARPA_INET_H 1

/* Define to 1 if you have the `clock_gettime’ function. */
#define EVENT__HAVE_CLOCK_GETTIME 1

/* Define to 1 if you have the declaration of `CTL_KERN’, and to 0 if you
don’t. */
#define EVENT__HAVE_DECL_CTL_KERN 1

/* Define to 1 if you have the declaration of `KERN_ARND’, and to 0 if you
don’t. */
#define EVENT__HAVE_DECL_KERN_ARND 0

/* Define to 1 if you have the declaration of `KERN_RANDOM’, and to 0 if you
don’t. */
#define EVENT__HAVE_DECL_KERN_RANDOM 1

/* Define to 1 if you have the declaration of `RANDOM_UUID’, and to 0 if you
don’t. */
#define EVENT__HAVE_DECL_RANDOM_UUID 1

/* Define if /dev/poll is available /
/
#undef EVENT__HAVE_DEVPOLL */

/* Define to 1 if you have the <dlfcn.h> header file. */
#define EVENT__HAVE_DLFCN_H 1

/* Define if your system supports the epoll system calls */
//#define EVENT__HAVE_EPOLL 1

/* Define to 1 if you have the `epoll_create1’ function. */
//#define EVENT__HAVE_EPOLL_CREATE1 1

/* Define to 1 if you have the `epoll_ctl’ function. */
//#define EVENT__HAVE_EPOLL_CTL 1

/* Define to 1 if you have the <errno.h> header file. */
#define EVENT__HAVE_ERRNO_H 1

/* Define to 1 if you have ERR_remove_thread_stat(). */
#define EVENT__HAVE_ERR_REMOVE_THREAD_STATE 1

/* Define to 1 if you have the `eventfd’ function. */
#define EVENT__HAVE_EVENTFD 1

/* Define if your system supports event ports /
/
#undef EVENT__HAVE_EVENT_PORTS */

/* Define to 1 if you have the `fcntl’ function. */
#define EVENT__HAVE_FCNTL 1

/* Define to 1 if you have the <fcntl.h> header file. */
#define EVENT__HAVE_FCNTL_H 1

/* Define to 1 if the system has the type `fd_mask’. */
#define EVENT__HAVE_FD_MASK 1

/* Do we have getaddrinfo()? */
#define EVENT__HAVE_GETADDRINFO 1

/* Define to 1 if you have the `getegid’ function. */
#define EVENT__HAVE_GETEGID 1

/* Define to 1 if you have the `geteuid’ function. */
#define EVENT__HAVE_GETEUID 1

/* Define this if you have any gethostbyname_r() /
/
#undef EVENT__HAVE_GETHOSTBYNAME_R */

/* Define this if gethostbyname_r takes 3 arguments /
/
#undef EVENT__HAVE_GETHOSTBYNAME_R_3_ARG */

/* Define this if gethostbyname_r takes 5 arguments /
/
#undef EVENT__HAVE_GETHOSTBYNAME_R_5_ARG */

/* Define this if gethostbyname_r takes 6 arguments /
/
#undef EVENT__HAVE_GETHOSTBYNAME_R_6_ARG */

/* Define to 1 if you have the `getifaddrs’ function. */
//#define EVENT__HAVE_GETIFADDRS 1

/* Define to 1 if you have the `getnameinfo’ function. */
#define EVENT__HAVE_GETNAMEINFO 1

/* Define to 1 if you have the `getprotobynumber’ function. */
#define EVENT__HAVE_GETPROTOBYNUMBER 1

/* Define to 1 if you have the `getservbyname’ function. */
#define EVENT__HAVE_GETSERVBYNAME 1

/* Define to 1 if you have the `gettimeofday’ function. */
#define EVENT__HAVE_GETTIMEOFDAY 1

/* Define to 1 if you have the <ifaddrs.h> header file. */
#define EVENT__HAVE_IFADDRS_H 1

/* Define to 1 if you have the `inet_ntop’ function. */
#define EVENT__HAVE_INET_NTOP 1

/* Define to 1 if you have the `inet_pton’ function. */
#define EVENT__HAVE_INET_PTON 1

/* Define to 1 if you have the <inttypes.h> header file. */
#define EVENT__HAVE_INTTYPES_H 1

/* Define to 1 if you have the `issetugid’ function. /
/
#undef EVENT__HAVE_ISSETUGID */

/* Define to 1 if you have the `kqueue’ function. /
/
#undef EVENT__HAVE_KQUEUE */

/* Define if the system has zlib /
/
#undef EVENT__HAVE_LIBZ */

/* Define to 1 if you have the `mach_absolute_time’ function. /
/
#undef EVENT__HAVE_MACH_ABSOLUTE_TIME */

/* Define to 1 if you have the <mach/mach_time.h> header file. /
/
#undef EVENT__HAVE_MACH_MACH_TIME_H */

/* Define to 1 if you have the <memory.h> header file. */
#define EVENT__HAVE_MEMORY_H 1

/* Define to 1 if you have the `mmap’ function. */
#define EVENT__HAVE_MMAP 1

/* Define to 1 if you have the `nanosleep’ function. */
#define EVENT__HAVE_NANOSLEEP 1

/* Define to 1 if you have the <netdb.h> header file. */
#define EVENT__HAVE_NETDB_H 1

/* Define to 1 if you have the <netinet/in6.h> header file. /
/
#undef EVENT__HAVE_NETINET_IN6_H */

/* Define to 1 if you have the <netinet/in.h> header file. */
#define EVENT__HAVE_NETINET_IN_H 1

/* Define to 1 if you have the <netinet/tcp.h> header file. */
#define EVENT__HAVE_NETINET_TCP_H 1

/* Define if the system has openssl */
#define EVENT__HAVE_OPENSSL 1

/* Define to 1 if you have the `pipe’ function. */
#define EVENT__HAVE_PIPE 1

/* Define to 1 if you have the `pipe2’ function. */
#define EVENT__HAVE_PIPE2 1

/* Define to 1 if you have the `poll’ function. */
#define EVENT__HAVE_POLL 1

/* Define to 1 if you have the <poll.h> header file. */
#define EVENT__HAVE_POLL_H 1

/* Define to 1 if you have the `port_create’ function. /
/
#undef EVENT__HAVE_PORT_CREATE */

/* Define to 1 if you have the <port.h> header file. /
/
#undef EVENT__HAVE_PORT_H */

/* Define if you have POSIX threads libraries and header files. /
/
#undef EVENT__HAVE_PTHREAD */

/* Define if we have pthreads on this system */
#define EVENT__HAVE_PTHREADS 1

/* Define to 1 if you have the `putenv’ function. */
#define EVENT__HAVE_PUTENV 1

/* Define to 1 if the system has the type `sa_family_t’. */
#define EVENT__HAVE_SA_FAMILY_T 1

/* Define to 1 if you have the `select’ function. */
#define EVENT__HAVE_SELECT 1

/* Define to 1 if you have the `sendfile’ function. */
#define EVENT__HAVE_SENDFILE 1

/* Define to 1 if you have the `setenv’ function. */
#define EVENT__HAVE_SETENV 1

/* Define if F_SETFD is defined in <fcntl.h> */
#define EVENT__HAVE_SETFD 1

/* Define to 1 if you have the `setrlimit’ function. */
#define EVENT__HAVE_SETRLIMIT 1

/* Define to 1 if you have the `sigaction’ function. */
#define EVENT__HAVE_SIGACTION 1

/* Define to 1 if you have the `signal’ function. */
#define EVENT__HAVE_SIGNAL 1

/* Define to 1 if you have the `splice’ function. */
#define EVENT__HAVE_SPLICE 1

/* Define to 1 if you have the <stdarg.h> header file. */
#define EVENT__HAVE_STDARG_H 1

/* Define to 1 if you have the <stddef.h> header file. */
#define EVENT__HAVE_STDDEF_H 1

/* Define to 1 if you have the <stdint.h> header file. */
#define EVENT__HAVE_STDINT_H 1

/* Define to 1 if you have the <stdlib.h> header file. */
#define EVENT__HAVE_STDLIB_H 1

/* Define to 1 if you have the <strings.h> header file. */
#define EVENT__HAVE_STRINGS_H 1

/* Define to 1 if you have the <string.h> header file. */
#define EVENT__HAVE_STRING_H 1

/* Define to 1 if you have the `strlcpy’ function. /
/
#undef EVENT__HAVE_STRLCPY */

/* Define to 1 if you have the `strsep’ function. */
#define EVENT__HAVE_STRSEP 1

/* Define to 1 if you have the `strtok_r’ function. */
#define EVENT__HAVE_STRTOK_R 1

/* Define to 1 if you have the `strtoll’ function. */
#define EVENT__HAVE_STRTOLL 1

/* Define to 1 if the system has the type `struct addrinfo’. */
#define EVENT__HAVE_STRUCT_ADDRINFO 1

/* Define to 1 if the system has the type `struct in6_addr’. */
#define EVENT__HAVE_STRUCT_IN6_ADDR 1

/* Define to 1 if s6_addr16' is a member of struct in6_addr’. */
#define EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR16 1

/* Define to 1 if s6_addr32' is a member of struct in6_addr’. */
#define EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR32 1

/* Define to 1 if the system has the type `struct sockaddr_in6’. */
#define EVENT__HAVE_STRUCT_SOCKADDR_IN6 1

/* Define to 1 if sin6_len' is a member of struct sockaddr_in6’. /
/
#undef EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN */

/* Define to 1 if sin_len' is a member of struct sockaddr_in’. /
/
#undef EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */

/* Define to 1 if the system has the type `struct sockaddr_storage’. */
#define EVENT__HAVE_STRUCT_SOCKADDR_STORAGE 1

/* Define to 1 if ss_family' is a member of struct sockaddr_storage’. */
#define EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1

/* Define to 1 if __ss_family' is a member of struct sockaddr_storage’. /
/
#undef EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */

/* Define to 1 if the system has the type `struct so_linger’. /
/
#undef EVENT__HAVE_STRUCT_SO_LINGER */

/* Define to 1 if you have the `sysctl’ function. */
#define EVENT__HAVE_SYSCTL 1

/* Define to 1 if you have the <sys/devpoll.h> header file. /
/
#undef EVENT__HAVE_SYS_DEVPOLL_H */

/* Define to 1 if you have the <sys/epoll.h> header file. */
#define EVENT__HAVE_SYS_EPOLL_H 1

/* Define to 1 if you have the <sys/eventfd.h> header file. */
#define EVENT__HAVE_SYS_EVENTFD_H 1

/* Define to 1 if you have the <sys/event.h> header file. /
/
#undef EVENT__HAVE_SYS_EVENT_H */

/* Define to 1 if you have the <sys/ioctl.h> header file. */
#define EVENT__HAVE_SYS_IOCTL_H 1

/* Define to 1 if you have the <sys/mman.h> header file. */
#define EVENT__HAVE_SYS_MMAN_H 1

/* Define to 1 if you have the <sys/param.h> header file. */
#define EVENT__HAVE_SYS_PARAM_H 1

/* Define to 1 if you have the <sys/queue.h> header file. */
#define EVENT__HAVE_SYS_QUEUE_H 1

/* Define to 1 if you have the <sys/resource.h> header file. */
#define EVENT__HAVE_SYS_RESOURCE_H 1

/* Define to 1 if you have the <sys/select.h> header file. */
#define EVENT__HAVE_SYS_SELECT_H 1

/* Define to 1 if you have the <sys/sendfile.h> header file. */
#define EVENT__HAVE_SYS_SENDFILE_H 1

/* Define to 1 if you have the <sys/socket.h> header file. */
#define EVENT__HAVE_SYS_SOCKET_H 1

/* Define to 1 if you have the <sys/stat.h> header file. */
#define EVENT__HAVE_SYS_STAT_H 1

/* Define to 1 if you have the <sys/sysctl.h> header file. */
//#define EVENT__HAVE_SYS_SYSCTL_H 1

/* Define to 1 if you have the <sys/timerfd.h> header file. */
#define EVENT__HAVE_SYS_TIMERFD_H 1

/* Define to 1 if you have the <sys/time.h> header file. */
#define EVENT__HAVE_SYS_TIME_H 1

/* Define to 1 if you have the <sys/types.h> header file. */
#define EVENT__HAVE_SYS_TYPES_H 1

/* Define to 1 if you have the <sys/uio.h> header file. */
#define EVENT__HAVE_SYS_UIO_H 1

/* Define to 1 if you have the <sys/wait.h> header file. */
#define EVENT__HAVE_SYS_WAIT_H 1

/* Define if TAILQ_FOREACH is defined in <sys/queue.h> */
#define EVENT__HAVE_TAILQFOREACH 1

/* Define if timeradd is defined in <sys/time.h> */
#define EVENT__HAVE_TIMERADD 1

/* Define if timerclear is defined in <sys/time.h> */
#define EVENT__HAVE_TIMERCLEAR 1

/* Define if timercmp is defined in <sys/time.h> */
#define EVENT__HAVE_TIMERCMP 1

/* Define to 1 if you have the `timerfd_create’ function. */
#define EVENT__HAVE_TIMERFD_CREATE 1

/* Define if timerisset is defined in <sys/time.h> */
#define EVENT__HAVE_TIMERISSET 1

/* Define to 1 if the system has the type `uint16_t’. */
#define EVENT__HAVE_UINT16_T 1

/* Define to 1 if the system has the type `uint32_t’. */
#define EVENT__HAVE_UINT32_T 1

/* Define to 1 if the system has the type `uint64_t’. */
#define EVENT__HAVE_UINT64_T 1

/* Define to 1 if the system has the type `uint8_t’. */
#define EVENT__HAVE_UINT8_T 1

/* Define to 1 if the system has the type `uintptr_t’. */
#define EVENT__HAVE_UINTPTR_T 1

/* Define to 1 if you have the `umask’ function. */
#define EVENT__HAVE_UMASK 1

/* Define to 1 if you have the <unistd.h> header file. */
#define EVENT__HAVE_UNISTD_H 1

/* Define to 1 if you have the `unsetenv’ function. */
#define EVENT__HAVE_UNSETENV 1

/* Define to 1 if you have the `usleep’ function. */
#define EVENT__HAVE_USLEEP 1

/* Define to 1 if you have the `vasprintf’ function. */
#define EVENT__HAVE_VASPRINTF 1

/* Define if waitpid() supports WNOWAIT /
/
#undef EVENT__HAVE_WAITPID_WITH_WNOWAIT */

/* Define if kqueue works correctly with pipes /
/
#undef EVENT__HAVE_WORKING_KQUEUE */

/* Define to 1 if you have the <zlib.h> header file. /
/
#undef EVENT__HAVE_ZLIB_H */

/* Define to the sub-directory where libtool stores uninstalled libraries. */
#define EVENT__LT_OBJDIR “.libs/”

/* Numeric representation of the version */
#define EVENT__NUMERIC_VERSION 0x02010800

/* Name of package */
#define EVENT__PACKAGE “libevent”

/* Define to the address where bug reports for this package should be sent. */
#define EVENT__PACKAGE_BUGREPORT “”

/* Define to the full name of this package. */
#define EVENT__PACKAGE_NAME “libevent”

/* Define to the full name and version of this package. */
#define EVENT__PACKAGE_STRING “libevent 2.1.8-stable”

/* Define to the one symbol short name of this package. */
#define EVENT__PACKAGE_TARNAME “libevent”

/* Define to the home page for this package. */
#define EVENT__PACKAGE_URL “”

/* Define to the version of this package. */
#define EVENT__PACKAGE_VERSION “2.1.8-stable”

/* Define to necessary symbol if this constant uses a non-standard name on
your system. /
/
#undef EVENT__PTHREAD_CREATE_JOINABLE */

/* The size of `int’, as computed by sizeof. */
#define EVENT__SIZEOF_INT 4

/* The size of `long’, as computed by sizeof. */
#define EVENT__SIZEOF_LONG 8

/* The size of `long long’, as computed by sizeof. */
#define EVENT__SIZEOF_LONG_LONG 8

/* The size of `off_t’, as computed by sizeof. */
#define EVENT__SIZEOF_OFF_T 8

/* The size of `pthread_t’, as computed by sizeof. */
#define EVENT__SIZEOF_PTHREAD_T 8

/* The size of `short’, as computed by sizeof. */
#define EVENT__SIZEOF_SHORT 2

/* The size of `size_t’, as computed by sizeof. */
#define EVENT__SIZEOF_SIZE_T 8

/* The size of `void *', as computed by sizeof. */
#define EVENT__SIZEOF_VOID_P 8

/* Define to 1 if you have the ANSI C header files. */
#define EVENT__STDC_HEADERS 1

/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
#define EVENT__TIME_WITH_SYS_TIME 1

/* Enable extensions on AIX 3, Interix. */
#ifndef EVENT___ALL_SOURCE

define EVENT___ALL_SOURCE 1

#endif
/* Enable GNU extensions on systems that have them. */
#ifndef EVENT___GNU_SOURCE

define EVENT___GNU_SOURCE 1

#endif
/* Enable threading extensions on Solaris. */
#ifndef EVENT___POSIX_PTHREAD_SEMANTICS

define EVENT___POSIX_PTHREAD_SEMANTICS 1

#endif
/* Enable extensions on HP NonStop. */
#ifndef EVENT___TANDEM_SOURCE

define EVENT___TANDEM_SOURCE 1

#endif
/* Enable general extensions on Solaris. */
#ifndef EVENT____EXTENSIONS__

define EVENT____EXTENSIONS__ 1

#endif

/* Version number of package */
#define EVENT__VERSION “2.1.8-stable”

/* Enable large inode numbers on Mac OS X 10.5. */
#ifndef EVENT___DARWIN_USE_64_BIT_INODE

define EVENT___DARWIN_USE_64_BIT_INODE 1

#endif

/* Number of bits in a file offset, on hosts where this is settable. /
/
#undef EVENT___FILE_OFFSET_BITS */

/* Define for large files, on AIX-style hosts. /
/
#undef EVENT___LARGE_FILES */

/* Define to 1 if on MINIX. /
/
#undef EVENT___MINIX */

/* Define to 2 if the system does not provide POSIX.1 features except with
this defined. /
/
#undef EVENT___POSIX_1_SOURCE */

/* Define to 1 if you need to in order for `stat’ and other things to work. /
/
#undef EVENT___POSIX_SOURCE */

/* Define to appropriate substitue if compiler doesnt have func /
/
#undef EVENT____func__ */

/* Define to empty if `const’ does not conform to ANSI C. /
/
#undef EVENT__const */

/* Define to __inline__' or __inline’ if that’s what the C compiler
calls it, or to nothing if ‘inline’ is not supported under any name. /
#ifndef EVENT____cplusplus
/
#undef EVENT__inline */
#endif

/* Define to `int’ if <sys/types.h> does not define. /
/
#undef EVENT__pid_t */

/* Define to `unsigned int’ if <sys/types.h> does not define. /
/
#undef EVENT__size_t */

/* Define to unsigned int if you dont have it /
/
#undef EVENT__socklen_t */

/* Define to `int’ if <sys/types.h> does not define. /
/
#undef EVENT__ssize_t */

#endif /* event2/event-config.h */


下面是虚拟机网络重定向设置,想从电脑端看到手机中的内容,还没有成功,要继续实验。

https://developer.android.google.cn/studio/run/emulator-networking?hl=zh-cn

PS F:\Android_Sdk\platform-tools> adb -s emulator-5554 forward tcp:6665 tcp:6666
6665

https://blog.csdn.net/weixin_27038261/article/details/117726241?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168119961316800180638618%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168119961316800180638618&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-117726241-null-null.142v82insert_down38,201v4add_ask,239v2insert_chatgpt&utm_term=%E4%B8%BB%E6%9C%BA%E5%90%8Candroid%E8%99%9A%E6%8B%9F%E6%9C%BA%E9%80%9A%E4%BF%A1&spm=1018.2226.3001.4187
1)PC作为客户端,模拟器1为主机

在这里插入图片描述
本机端:
michael@SD-20220518ZLPG:~$ curl http://127.0.0.1:6665/dump
curl: (52) Empty reply from server

虚拟机端:
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23338.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超级超级好用的浏览器扩展插件

良心亲测&#xff0c;绝对好用 1. AdBlock —最佳广告拦截工具&#xff08;拦截广告&#xff09; 2.AIX智能下载器(图片/视频/音乐/文&#xff08;下载图片、视频&#xff09; 3.Allow Copy 超级复制&AI智能小...&#xff08;复制文案&#xff09; 4.EndNote Click - Forme…

菜谱APP源码和设计报告

《移动互联开发》 课程作业 学 院&#xff1a; 班 级&#xff1a; 学 号&#xff1a; 姓 名&#xff1a; 日 期&#xff1a; 设计要求&#xff08;提交文档时需删除&#xff09;: 1.本课程设计作为《Android 程序设计》的期末考查内容。 2.任务安排&#xff1a; &…

实测:GPT -3.5 与GPT -4.0 编程能力对比

在本文中&#xff0c;我们将从三个不同角度对比GPT-4和GPT-3.5的代码能力&#xff0c;包括&#xff1a;技术概念解释、代码编写能力和调试代码能力。这将有助于我们了解这两个版本的人工智能语言模型在各方面的优劣。 推荐人 | 互联网老孙 编辑者 | JK 1. 技术概念解释对比 问题…

官方 gpt3.5, gpt4.0、github copilot chat、gpt3.5 api、gpt4 api 对比

这是「进击的Coder」的第 848 篇技术分享 作者&#xff1a;刘志军 来源&#xff1a;Python 之禅 “ 阅读本文大概需要 9 分钟。 ” gpt4 的智能程度大于 gpt3.5&#xff0c;毫无争议&#xff0c;但是 OpenAI 提供的 GPT3.5 API 能力是否和官方的 GPT3.5 相当&#xff1f;对应…

刺激,GPT4/ChatGPT3.5/DALL-E同时玩

GPT4/ChatGPT3.5/DALL-E&#xff1a; AI创想师 ​ 这个画图效果着实可以 用来回答某某的问题GPT4确实比GPT3.5准 ​ 这是GPT4的回答 ​ 这是GPT3.5的回答&#xff0c;确实差一些 用了几天&#xff0c;发现可以一直(bai)用(piao)!!!

这套源码融合了chatgpt3.5、chatgpt4.0、midjourney、stable diffusion等技术,简直是炫酷至极

首先&#xff0c;让我们来看下面的效果演示图&#xff1a; 经过实际体验&#xff0c;这套chatgpt技术提供了令人惊艳的快速响应。整个系统可以在国内服务器上部署&#xff0c;只需配置好反向代理功能。 midjourney和stable diffusion在运行过程中表现得十分稳定。而且&#xff…

用OceanBase试了一下ChatGPT开源文档问答助手

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 随着去年年底 ChatGPT 的火爆出圈&#xff0c;到近日 OpenAI 发布了最新的 GPT-4 模型&#xff0c;大家都在思考、尝试如何利用 ChatGPT 的能力来构建自己的应用。 我们最近发现&#xff0c;在开…

淘宝天猫API详情接口调用分享

为了进行此平台API的调用&#xff0c;首先我们需要做下面几件事情。 1、 获取一个KEY。 2、 参考API文档里的接入方式和示例。 3、查看测试工具是否有需要的接口&#xff0c;响应实例的返回字段是否符合参数要求。 4、利用平台的文档中心和API测试工具&#xff0c;对接口进行测…

淘宝天猫API_获取商品详情原数据

item_get_app-获得淘宝app商品详情原数据 获取key和secret API返回结果 { "item": { "apiStack": [ { "name": "esi", "value": "{\"global\":{…

云从发布从容AI大模型;莫言用ChatGPT帮余华写颁奖词;罗普特遭立案调查丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 亚马逊网络服务将向印度的云基础设施投资127亿美元 5月18日&#xff0c;亚马逊宣布&#xff0c;亚马逊网络服务计划到2030年向印度的云基础设施投资10560亿印度卢比&#xff08;127亿美元&#xff09;&#xff…

03.SELF-INSTRUCT+Alpaca

文章目录 前言泛读储备知识提示学习提示工程Promt Engineering答案工程 背景介绍研究SELF-INSTRUCT的动机研究意义&贡献 精读Overview种子任务步骤1&#xff1a;定义指令数据步骤2&#xff1a;自动指令数据生成步骤2.1指令生成步骤2.2指令分类步骤2.3实例生成步骤2.4筛选和…

Windows应急响应 - 敏感目录文件痕迹排查,最近打开的文件 Recent,临时目录Temp,预读取文件Prefetch,程序执行情况Amcache.hve,Windows文件访问时间不更新原理

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 敏感文件痕迹排查 一、根据时间查找 Forfiles1、访问时间不更新问题 二、最近打开的文件 …

留学生如何利用好Chat GPT,助力留学生活?

目录 01.什么是Chat GPT &#xff1f; 02.Chat GPT使用的问题 03.Chat GPT为留学生活提供了哪些便利&#xff1f; 04.海外院校对Chat GPT的态度 禁止使用 允许使用 05.如何正确使用呢&#xff1f; 07.使用技巧 08.使用的注意事项 寄语 01.什么是Chat GPT &#xff1f;…

文笔润色-文本校对改写工具

文段改写软件 写作是一项对于很多人来说都需要频繁进行的活动&#xff0c;无论是工作中的商业写作还是学术写作&#xff0c;在完成优质内容的同时也需要付出大量的时间和精力进行语言润色和修改。然而&#xff0c;现在有了147ChatGPT改写润色软件&#xff0c;该软件可以全自动…

chatgpt赋能python:Python中怎么开方

Python中怎么开方 在Python中&#xff0c;开方是一种非常常见的数学操作。开方指的是求一个数的平方根或立方根等等。在Python中&#xff0c;我们可以使用自带的math库或使用第三方库numpy来进行开方操作。 使用math库进行开方操作 math库提供了sqrt()函数&#xff0c;可以用…

chatgpt赋能python:Python怎么计算开方

Python怎么计算开方 Python语言是一种高级程序语言&#xff0c;具有易学、易读、易写、易维护等特点。在数据分析、科学计算、人工智能等领域&#xff0c;Python被广泛应用。计算开方在数学计算中是一个常见的操作&#xff0c;Python也提供了多种求开方的方法。 常见的求开方…

chatgpt赋能python:Python怎样开方?完整解析Python开方方法

Python怎样开方&#xff1f;完整解析Python开方方法 Python作为一种流行的编程语言&#xff0c;用途十分广泛&#xff0c;可以用来进行数据分析、网络爬虫、Web开发等。Python还支持数学计算&#xff0c;包括开方。Python怎样开方&#xff1f;下面我们来一一解析Python开方的方…

chatgpt赋能python:开方在Python中的用法

开方在Python中的用法 开方是数学中常见的一种运算&#xff0c;用于求一个数的平方根。在Python中&#xff0c;开方运算可以通过使用math模块中的sqrt函数来实现。本文将介绍开方运算的概念、Python中的应用以及一些常见问题的解决方法。 开方的概念 开方是指&#xff0c;对…

陆奇-奇绩创坛-chatGPT新范式,新时代,新机会

奇绩创坛-新范式&#xff0c;新时代&#xff0c;新机会 01-新范式 新范式的新拐点 新范式的历史环境 新范式的社会影响 新范式的缔造者&#xff1a;Sam Altman和OpenAI 新范式的动力引擎 新范式的演化路径 02-新时代 新时代的宏观发展格局 新时代的中国机会 新时代的OpenAI生…

chatgpt赋能python:Python自动化脚本-让你的代码自动运行

Python自动化脚本-让你的代码自动运行 Python自动化脚本是一种强大的工具&#xff0c;可以在不断重复执行的任务上节省时间和精力。如果你是一名程序员或者数据分析师&#xff0c;你可能会经常处理一些需要不断重复的任务&#xff0c;如数据收集、清理、转换和加载。在这种情况…