android jni socket

        其实这个标题没什么意思;但是想来想去,自己(新手)查了很多资料才调通,就打算在此一写。

android-jni的socket编程,就是调用底层linux的socket编程。android平台,一般只需要关心客户端代码,如下:(从华清远见嵌入式linux应用开发教材上copy的,手头没好点的例子)

[cpp] view plain copy  print?
  1. /*client.c*/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <netdb.h>
  7. #include <sys/types.h>
  8. #include <netinet/in.h>
  9. #include <sys/socket.h>
  10. #define SERVPORT 8591
  11. #define MAXDATASIZE 100
  12. main(int argc,char *argv[])
  13. {
  14. int sockfd,sendbytes;
  15. char buf[MAXDATASIZE];
  16. struct hostent *host;
  17. struct sockaddr_in serv_addr;
  18. if (argc < 2)
  19. {
  20. fprintf(stderr,"Please enter the server's hostname!\n");
  21. exit(1);
  22. }
  23. /*地址解析函数*/
  24. if ((host=gethostbyname(argv[1]))==NULL)
  25. {
  26. perror("gethostbyname");
  27. exit(1);
  28. }
  29. printf("%s",host->h_name);
  30. /*创建socket*/
  31. if ((sockfd=socket(AF_INET,SOCK_STREAM,0))== -1)
  32. {
  33. perror("socket");
  34. exit(1);
  35. }
  36. /*设置sockaddr_in 结构体中相关参数*/
  37. serv_addr.sin_family=AF_INET;
  38. serv_addr.sin_port=htons(SERVPORT);
  39. serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
  40. bzero(&(serv_addr.sin_zero),8);
  41. /*调用connect函数主动发起对服务器端的连接*/
  42. if (connect(sockfd,(struct sockaddr *)&serv_addr,\
  43. sizeof(struct sockaddr))== -1)
  44. {
  45. perror("connect");
  46. exit(1);
  47. }
  48. /*发送消息给服务器端*/
  49. if ((sendbytes=send(sockfd,"hello",5,0))== -1)
  50. {
  51. perror("send");
  52. exit(1);
  53. }
  54. close(sockfd);
  55. }

然后可以参照android-ndk的sample把它改成jni方式调用。

接收消息,可以采用如下方式:(参考APUE)

[cpp] view plain copy  print?
  1. long  ReceiveMessage(BYTE *buf,UINT bufSize,UINT *recvbufLen,UINT nTimeOut)
  2. {
  3. LOGI("ReceiveMessage");
  4. long lRet = -1;
  5. int recvbytes;
  6. uint startTime = GetTickCount(),endTime;
  7. do
  8. {
  9. endTime = GetTickCount();
  10. if ((recvbytes=recv(sockfd, buf, bufSize, MSG_DONTWAIT)) == -1)
  11. {
  12. lRet = -1;
  13. //LOGI("recv error");
  14. //LOGII(errno,"recv errno",__LINE__); // 11 : Resource temporarily unavailable
  15. }
  16. else
  17. {
  18. lRet = 0;
  19. break;
  20. }
  21. }while(lRet == -1 && endTime - startTime < nTimeOut);
  22. *recvbufLen = recvbytes;
  23. if(recvbytes > 0)
  24. LOGArr((unsigned char*)buf,recvbytes);
  25. return lRet;
  26. }

上例中用指针传输出参数而不是引用,是因为是在.c文件中编译jni,不支持c++特性。而jni-c++这一部分还没完全搞清楚,等搞清楚了再写一篇。

需要说明的最重要的一点是,工程目录下的AndroidManifest.xml需要添加网络权限支持才能调通:

[html] view plain copy  print?
  1. <!-- 增加jni socket支持-->
  2. <uses-permission android:name="android.permission.INTERNET" />

android jni socket相关推荐

  1. android JNI(转)

    原文:http://jinguo.iteye.com/blog/696185 Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行 ...

  2. Android JNI(三)——JNI数据结构之JNINativeMethod

    上俩篇,我们讲了都是jni基础的原理知识以及如何使用cmake实现简单的jni.接下来本想讲解Java与Native相互调用的,但是发现Java与Native相互调用中设计了好多基础知识,其中用的比较 ...

  3. Android JNI作用及其详解

    Android JNI作用及其详解 Java Native Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 J ...

  4. Android JNI使用方法,JNI机制详解

    Android JNI使用方法,JNI机制详解 JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此N ...

  5. [转]Android JNI使用方法

    本文转自:http://www.open-open.com/lib/view/open1324909652374.html 经过几天的努力终于搞定了android JNI部分,下面将我的这个小程序和大 ...

  6. Android JNI开发入门之一

    JNI在Android系统中有着广泛的应用.Android系统底层都是C/C++实现的,上层提供的API都是Java的,Java通过JNI调用底 层的实现.比如:Android API多媒体接口Med ...

  7. Android:Socket客户端开发,Android 的Socket客户端优化,Android非UI线程修改控件程序崩溃的问题

    一.Android:Socket客户端开发 创建一个工程 我们要做的是按下按键之后,去往服务器 (服务器) 或者我们自己写的服务器 ,给他发送一些预定好的东西 然后打开操作界面 然后修改一下 你要发送 ...

  8. java jni 数据类型_【Android JNI】Native层解析Java复杂数据类型HashMap

    前提 Java HashMap 是基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用null值和null键.HashMap是存放引用类型数据的容器,只能存放引用数据类型,不能存 ...

  9. Android JNI原理分析

    引言:分析Android源码6.0的过程,一定离不开Java与C/C++代码直接的来回跳转,那么就很有必要掌握JNI,这是链接Java层和Native层的桥梁,本文涉及相关源码: frameworks ...

最新文章

  1. UICollectionView自定义布局(二)
  2. 明尼苏达大学研究团队道歉,Linux内核维护人员:拒绝
  3. 防火墙工作原理—Vecloud微云
  4. ValueError: Unknown initializer: GlorotUniform
  5. java 泛型 .net_Java泛型
  6. mysql 主从_搭建mysql主从并编写监控主从状态脚本
  7. mysql开启profiling
  8. 二分查找求上界和下界
  9. java中calendarr_Java端获取当前时间的前12个小时
  10. Python课程期末考试编程题自动批卷原理与实现模板
  11. intelRealsense D435 python读取并显示彩图和深度图
  12. Python(2.7)-元组(tuple)
  13. ModelSim使用$display查看变量值和输出信息
  14. 阿里大佬推荐初学者练习的 Java 开源项目
  15. java 堆栈信息分析_Java堆栈信息分析
  16. chrome扩展开发与上架
  17. 对Python【返回函数与闭包】的一点思考
  18. Consider defining a bean of type问题
  19. 【面试题记】删除字符串中相邻重复字符
  20. 如何避免成为背锅侠?

热门文章

  1. myeclipse 8.6安装freemarker插件
  2. Network Virtualization In Solaris 11
  3. 【联合仿真】电机与机械臂的联合simulink仿真
  4. python抓取抖音用户画像,摩羯天蝎居然刷得最多?
  5. 第1章:认识Java
  6. python字典成绩_python字典总结
  7. 二维数组求最小值_求一列中满足条件的最大最小值
  8. 洛谷 P1454【圣诞夜的极光】
  9. LINUX类主机JAVA应用程序占用CPU、内存过高分析手段
  10. (五)cobbler自定义系统安装