1、JavaVM 和 JNIEnv
JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立。
JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线程都可以使用这个JavaVM。
当后台线程需要调用JNI native时,在native库中使用全局变量保存JavaVM尤为重要,这样使得后台线程能通过JavaVM获得JNIEnv。

// e.g
JNIEnv *env = NULL;
if(0 == gVm-> AttachCurrentThread(&env, NULL)){}

2、Socket API: 面向连接的通信
int socket(int domain, int type, int protocol);
创建一个socket
domain: 指定将会产生通信的socket域,并选择将要用到的协议簇:
PF_LOCAL:主机内部通信协议簇,该协议簇使物理上运行的同一台设备上的应用程序可以用Socket APIs彼此通信;
PF_INET: Internet第4版协议簇,该协议簇使应用程序可以与网络上的其他地方运行的应用程序进行通信;

type:指定通信的语义,支持一下几种主要的socket类型。
SOCKET_STREAM: 通过使用TCP协议的、面向面向连接的通信Stream Socket类型;
SOCKET_DGRAM:提供使用UDP协议的,无连接的通信Datagram Socket类型。

protocol: 指定将会用到的协议;

int bind(int socketDescriptor, const struct sockaddr *address, socklen_t addressLength);
将socket与一个地址绑定
socket描述符:指定将绑定到指定地址的socket实例;
address:指定socket被绑定的协议地址;
address length:指定传递给函数的协议地址结构的大小;

int listen(int socketDescriptor, int backlog);
监听socket
socket 描述符,
backlog:指定保存挂起的输入连接的队列大小。

int accept(int socketDescriptor, struct sockaddr *address, socklen_t * addressLength);
用来显示的将输入连接从监听队列取出并接受它;
socket描述符;
address:一个指向客户协议地址的指针,可以为NULL;
addressLength: 客户协议大小,可以为NULL;

ssize_t recv(int socketDescriptor, void *buffer, size_t bufferLength, int flags);
从socket 接收数据
socket描述符;
buffer: 指向内存地址,用来保存从socket接收数据;
bufferLength:缓冲区大小;
flags:接收所需要的额外标志;

ssize_t recvfrom(int socketDescriptor, void *buffer, size_t bufferLength, int flags, struct sockaddr *address, socklen_t *addressLength);
使用recvfrom从udp socket中接收数据;
socketDescriptor;
buffer: 指向内存地址的指针;
bufferLength: 缓存区大小
flags: 额外标记
address:用于保存客户端发送的协议地址,可以为NULL
addressLength: 指定客户端要写入的协议地址的内存大小,可以为NULL;

ssize_t send(int socketDescriptor, void *buffer, size_t bufferLength, int flags);
想socket发送数据
socket描述符;
buffer: 指向内存地址;
bufferLength:长度;
flags:发送所需要的额外标志;

ssize_t sendto(int socketDescriptor, const void *buffer, size_t bufferSize, int flags, const struct sockaddr *address, socklen_t, addressLength);‘’
udp发送函数
socketDescriptor;
buffer: 缓冲区指针
bufferLength:缓冲区大小;
flags: 额外标记
address:协议地址
addressLength:协议地址大小

int connect(int socketDescriptor, const struct sockaddr *addr, socklen_t addressLength);
通过提供协议地址来连接socket和server socket,
socket描述符;
address: socket要连接的协议地址;
addressLength: 所提供的地址结构的长度;

异步IO
sys/select.h
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
nfds:为最高编号的描述符+1,select函数将监控nfds指定数量的描述符。
readfds:设置将被监控可读性的描述符列表集;
writefs:设置将被监控可写性的描述符列表集;
exceptfds:设置将被监控任何类型错误的描述符列表集;
timeout: 指定为了完成选择而阻塞当前进程的最大时间间隔,可以为NULL;

参考:《Android C++高级编程》 8/9/10章

JNI 和 socket api的更多相关文章

  1. JAVA Socket API与LINUX Socket API探究

    代码 这是一个带有UI界面的JAVA网络聊天程序,使用Socket连接完成通信. JAVA服务端程序 import java.io.IOException; import java.io.InputS ...

  2. Creating Your Own Server: The Socket API, Part 2

    转:http://www.linuxforu.com/2011/09/creating-your-own-server-the-socket-api-part-2/ By Pankaj Tanwar  ...

  3. Creating Your Own Server: The Socket API, Part 1

    转:http://www.linuxforu.com/2011/08/creating-your-own-server-the-socket-api-part-1/ By Pankaj Tanwar  ...

  4. UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认

    在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不 ...

  5. c/c++ socket API 调用后的错误判断 perror errno

    socket API 调用后的错误判断 perror errno 调用完socket API后,需要判断调用是否成功与失败.如果失败,会自动设置errno(是个整数), 并且用perror可以打印出具 ...

  6. LwIP - raw/callback API、协议栈API(sequential API)、BSD API(或者说 SOCKET API)

    1.使用raw/callback API编程,用户编程的方法是向内核注册各种自定义的回调函数,回调函数是与内核实现交换的唯一方式. recv_udp, accept_function, sent_tc ...

  7. socket编程 ------ BSD socket API

    伯克利套接字(Berkeley sockets),也称为BSD Socket.伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信. BSD Socket的应用 ...

  8. Python Socket API 笔记

    将上节中的C#该成Python版的容易程度大大超出了我的意料之外.从来没有发现,仅仅用灰尘简单的几句话就实现了该程序的主要功能,可见python的简易和强大之处.这里先对SocketAPI 做一下总结 ...

  9. TCP协议和socket API 学习笔记

    本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类:  原文地址:TCP协议和socket API 学习笔记 作者:gilb ...

随机推荐

  1. 【linux】dpkg 命令使用说明

    dpkg是一个debian包管理工具.能够对包进行安装.卸载.获取信息等操作.用法:    安装(解包并配置):       dpkg -i package_file       dpkg --ins ...

  2. java poi reader常用API汇总

    注意:(1)判断行的最大数量建议使用sheet.getLastRowNum();(2)判断每行最大列数建议使用row.getLastCellNum(); [JAVA]特别注意,POI中getLastR ...

  3. 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP

    前言 Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单一职责SRP) The ...

  4. VS 正则表达式替换内容

    很少使用VS的正则替换功能,最近因为需要添加大量的默认值,但是又不想重新类,就想到了这个. 1.替换带有///描述的属性 查找的正则表达式: /// <summary>((.)*((.|\ ...

  5. C#基础知识-引用类型和值类型的区别(六)

    在第一篇中我们介绍了C#中基本的15种数据类型,这15种数据类型中又分为两大类,一种是值类型,一种是引用类型.值类型有sbyte.short.long.int.byte.ushort.uint.ulo ...

  6. vs文件属性(生成操作)各选项功能

    右击项目里的文件,选择属性(F4)会有[生成操作]的选项. 它提供了14项选择,如图: 在这说一下常用的选项: 1.编译 编译用于c#代码类的操作,编译之后输出在该程序集的bin目录下.换句话说,代码 ...

  7. jQuery之检测分析纠错------地狱的镰刀

    1. 答: 或者: $(selector).eq(0).hide(); 解答:get() 方法获得由选择器指定的 DOM 元素. 2. 答: 3, 答1: 答2: 4. slideDown()方法格式 ...

  8. freebsd mount linprocfs

    mount用来做什么? to prepare and graft a special device or the remote node(rhost:path) on to the file syst ...

  9. SharePoint 2013 - Breadcrumb

    By default SharePoint 2013 doesn’t have a breadcrumb (like the 2010 version used to have). This was ...

  10. JSTL核心库

    1 out和set(重点) out <c:out value=”aaa”/> 输出aaa字符串常量 <c:out value=”${aaa}”/> 与${aaa}相同 < ...