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. What's the difference between @Component, @Repository & @Service annotations in Spring?

    @Component is equivalent to <bean> @Service, @Controller , @Repository = {@Component + some mo ...

  2. javascript方法重载惹的祸

    先贴出代码,看看执行结果会是什么? function ShowMsg() { //函数1 this.sure = function () { alert("ok"); }; //函 ...

  3. 【Sql server: T-Sql 技术内幕 系列】之索引篇

    本文系 T-Sql技术内幕系列读后感. 用过数据库的程序猿都知道,索引可以极大的优化sql语句的执行时间,但是您要问我,怎么减少的,我只能说:"抱歉,我也不太清楚." 带着这个疑惑 ...

  4. 纯CSS的三角符号

    项目中经常用到三角形,现在给大家讲下用纯CSS写的下三角实心图形 .triangle{ border-width: 5px 4px 0 4px; border-color: #454A7B trans ...

  5. mysql七:索引原理与慢查询优化(待完整)

    一.介绍 索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要. 索引优化应该是对查询性能优 ...

  6. ajax异步请求/同源策略/跨域传值

    基本概念 Ajax 全称是异步的 JavaScript 和 XML . 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进 ...

  7. sublime Error executing: /usr/bin/security dump-trust-settings -d

    sublime text2突然crash,无法简单粗暴的关闭,就开始认真解决这个问题. 问题: 参考文献:https://github.com/wbond/package_control/issues ...

  8. 【代码笔记】Java常识性基础补充(一)——赋值运算符、逻辑运算符、三元运算符、Scanner类、键盘输入、Random类、随机数

    为什么要进行Java常识性基础补充? 之前学习Java语言,学得很多很杂,而且是很多不同的方面插入讲解的,比如在跟班上课,自学java编程例子,java语法,过了很久,因为各种原因长时间不怎么写,有时 ...

  9. contentType和dataType

    contentType: 告诉服务器,我要发什么类型的数据 dataType:告诉服务器,我要想什么类型的数据,如果没有指定,那么会自动推断是返回 XML,还是JSON,还是script,还是Stri ...

  10. angular怎么样注销事件

    angular怎么样注销事件 $scope.$on("$destroy", function() { //清除配置,不然scroll会重复请求 }) 在Controller中监听$ ...