Android利用LocalSocket实现Java端进程与C端进程之间的IPC

Android进程间大数据通信:LocalSocket 说起Android进行间通信,大家第一时间会想到AIDL,但是由于Binder机制的限制,AIDL无法传输超大数据。那么我们如何在进程间传输大数据呢?Android中给我们提供了另外一个机制:LocalSocket它会在本地创建一个socket通道来进行数据传输。那么它怎么使用?首先我们需要两个应用:客户端和服务端。 阅读详情

转自:http://www.cnblogs.com/zealotrouge/p/3152941.html


Android利用LocalSocket实现Java端进程与C端进程之间的IPC

  Android是建立在Linux之上的OS,在涉及到安全、网络协议、文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需要打通Java端进程和C端进程,使之能高效地通信。这样,C端进程用于实现功能,Java端进程负责UI、功能的触发及结果处理就可以了。

  对于*nix系统来说,“一切皆为文件”,Socket也不例外,Socket按照收发双方的媒介来说有三种类型:1,通过网络端口;2,通过文件系统;3,通过内存映射文件。具体说来,三种类型均可以用来作为IPC的Socket:1,通过本地回环接口(即LoopBack)127.0.0.1来收发数据;2,通过文件作为收发数据的中转站;3,在内存中开辟一块区域作为收发数据的中转站,此区域仍然使用文件读写API进行访问。LocalSocket支持方式2和方式3,从效率的角度来说,显然是方式3效率最高,那么下面我们就使用LocalSocket来演示如何实现Java端进程与C端进程之间的IPC。

  以下的demo是Java端作为server,C端作为client;实际场景中可能更多的是Java端作为client,而C端作为server。

服务端代码如下:

复制代码
  1 package main.activity;
  2 
  3 import java.io.IOException;
  4 import java.io.InputStream;
  5 import java.io.InputStreamReader;
  6 
  7 import android.app.Activity;
  8 import android.net.LocalServerSocket;
  9 import android.net.LocalSocket;
 10 import android.os.Bundle;
 11 import android.util.Log;
 12 
 13 /**
 14  * @author pengyiming
 15  * @note 启动localSocketServer
 16  *
 17  */
 18 
 19 public class LocalSocketServerActivity extends Activity
 20 {
 21     /* 数据段begin */
 22     private final String TAG = "server";
 23     
 24     private ServerSocketThread mServerSocketThread;
 25     /* 数据段end */
 26     
 27     /* 函数段begin */
 28     @Override
 29     protected void onCreate(Bundle savedInstanceState)
 30     {
 31         super.onCreate(savedInstanceState);
 32         
 33         mServerSocketThread = new ServerSocketThread();
 34         mServerSocketThread.start();
 35     }
 36     
 37     @Override
 38     protected void onDestroy()
 39     {
 40         super.onDestroy();
 41         
 42         mServerSocketThread.stopRun();
 43     }
 44     /* 函数段end */
 45     
 46     /* 内部类begin */
 47     private class ServerSocketThread extends Thread
 48     {
 49         private boolean keepRunning = true;
 50         private LocalServerSocket serverSocket;
 51         
 52         private void stopRun()
 53         {
 54             keepRunning = false;
 55         }
 56         
 57         @Override
 58         public void run()
 59         {
 60             try
 61             {
 62                 serverSocket = new LocalServerSocket("pym_local_socket");
 63             }
 64             catch (IOException e)
 65             {
 66                 e.printStackTrace();
 67                 
 68                 keepRunning = false;
 69             }
 70             
 71             while(keepRunning)
 72             {
 73                 Log.d(TAG, "wait for new client coming !");
 74                 
 75                 try
 76                 {
 77                     LocalSocket interactClientSocket = serverSocket.accept();
 78                     
 79                     //由于accept()在阻塞时,可能Activity已经finish掉了,所以再次检查keepRunning
 80                     if (keepRunning)
 81                     {
 82                         Log.d(TAG, "new client coming !");
 83                         
 84                         new InteractClientSocketThread(interactClientSocket).start();
 85                     }
 86                 }
 87                 catch (IOException e)
 88                 {
 89                     e.printStackTrace();
 90                     
 91                     keepRunning = false;
 92                 }
 93             }
 94             
 95             if (serverSocket != null)
 96             {
 97                 try
 98                 {
 99                     serverSocket.close();
100                 }
101                 catch (IOException e)
102                 {
103                     e.printStackTrace();
104                 }
105             }
106         }
107     }
108     
109     private class InteractClientSocketThread extends Thread
110     {
111         private LocalSocket interactClientSocket;
112         
113         public InteractClientSocketThread(LocalSocket interactClientSocket)
114         {
115             this.interactClientSocket = interactClientSocket;
116         }
117         
118         @Override
119         public void run()
120         {
121             StringBuilder recvStrBuilder = new StringBuilder();
122             InputStream inputStream = null;
123             try
124             {
125                 inputStream = interactClientSocket.getInputStream();
126                 InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
127                 char[] buf = new char[4096];
128                 int readBytes = -1;
129                 while ((readBytes = inputStreamReader.read(buf)) != -1)
130                 {
131                     String tempStr = new String(buf, 0, readBytes);
132                     recvStrBuilder.append(tempStr);
133                 }
134             }
135             catch (IOException e)
136             {
137                 e.printStackTrace();
138                 
139                 Log.d(TAG, "resolve data error !");
140             }
141             finally
142             {
143                 if (inputStream != null)
144                 {
145                     try
146                     {
147                         inputStream.close();
148                     }
149                     catch (IOException e)
150                     {
151                         e.printStackTrace();
152                     }
153                 }
154             }
155         }
156     }
157     /* 内部类end */
158 }
复制代码

 客户端代码如下:

复制代码
 1 package main.activity;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.util.Log;
 6 
 7 /**
 8  * @author pengyiming
 9  * @note 用于启动localSocketClient,向server发送心跳报文
10  *
11  */
12 
13 public class LocalSocketClientActivity extends Activity
14 {
15     /* 数据段begin */
16     private final String TAG = "client";
17     
18     private HeartBeatThread mHeartBeatThread;
19     
20     public native int startHeartBeat();
21     /* 数据段end */
22     
23     /* 函数段begin */
24     static
25     {
26         System.loadLibrary("pymclient");
27     }
28     
29     @Override
30     protected void onCreate(Bundle savedInstanceState)
31     {
32         super.onCreate(savedInstanceState);
33         
34         mHeartBeatThread = new HeartBeatThread();
35         mHeartBeatThread.start();
36     }
37     
38     @Override
39     protected void onDestroy()
40     {
41         super.onDestroy();
42         
43         mHeartBeatThread.stopRun();
44     }
45     /* 函数段end */
46     
47     /* 内部类begin */
48     private class HeartBeatThread extends Thread
49     {
50         int ret;
51         boolean keepRunning = true;
52         
53         public void stopRun()
54         {
55             keepRunning = false;
56         }
57         
58         @Override
59         public void run()
60         {
61             Log.d(TAG, "start heart beat!");
62             
63             while (keepRunning)
64             {
65                 ret = startHeartBeat();
66                 
67                 Log.d(TAG, "ret = " + ret);
68                 
69                 if (ret != 0)
70                 {
71                     break;
72                 }
73                 
74                 try
75                 {
76                     sleep(1000);
77                 }
78                 catch (InterruptedException e)
79                 {
80                     e.printStackTrace();
81                 }
82             }
83             
84             Log.d(TAG, "stop heart beat!");
85         }
86     }
87     /* 内部类end */
88 }
复制代码

上述客户端代码启动了一个线程用于发送“心跳”报文,每隔1s构建一个新的LocalSocket,连接服务端并发送流数据,其核心就在于native方法的实现。值得一提的是,我最初使用原生socket函数,没想connect总是返回错误;后来在同事的提醒下,我参考了Android源码rild.c中socket_local_client的使用,并从socket_local_client.c中抽取出相应代码改写而成。

客户端native方法头文件:

复制代码
 1 /* DO NOT EDIT THIS FILE - it is machine generated */
 2 #include <jni.h>
 3 /* Header for class main_activity_LocalSocketClientActivity */
 4 
 5 #ifndef _Included_main_activity_LocalSocketClientActivity
 6 #define _Included_main_activity_LocalSocketClientActivity
 7 #ifdef __cplusplus
 8 extern "C" {
 9 #endif
10 
11 /* socket命名空间(见cutils/sockets.h) */
12 #define ANDROID_SOCKET_NAMESPACE_ABSTRACT 0
13 #define ANDROID_SOCKET_NAMESPACE_RESERVED 1
14 #define ANDROID_SOCKET_NAMESPACE_FILESYSTEM 2
15 
16 /* socket类型 */
17 #define SOCK_STREAM      1
18 #define SOCK_DGRAM       2
19 #define SOCK_RAW         3
20 #define SOCK_RDM         4
21 #define SOCK_SEQPACKET   5
22 #define SOCK_PACKET      10
23 
24 /* 清0宏 */
25 #define MEM_ZERO(pDest, destSize) memset(pDest, 0, destSize)
26 
27 /* 错误码定义 */
28 #define NO_ERR 0
29 #define CREATE_ERR -1
30 #define CONNECT_ERR -2
31 #define LINUX_MAKE_ADDRUN_ERROR -3
32 #define NO_LINUX_MAKE_ADDRUN_ERROR -4
33 #define CLOSE_ERR -5
34 
35 /* 是否使用linux的本地socket命令空间 */
36 #define HAVE_LINUX_LOCAL_SOCKET_NAMESPACE "linux_local_socket_namespace"
37 
38 #undef main_activity_LocalSocketClientActivity_MODE_PRIVATE
39 #define main_activity_LocalSocketClientActivity_MODE_PRIVATE 0L
40 #undef main_activity_LocalSocketClientActivity_MODE_WORLD_READABLE
41 #define main_activity_LocalSocketClientActivity_MODE_WORLD_READABLE 1L
42 #undef main_activity_LocalSocketClientActivity_MODE_WORLD_WRITEABLE
43 #define main_activity_LocalSocketClientActivity_MODE_WORLD_WRITEABLE 2L
44 #undef main_activity_LocalSocketClientActivity_MODE_APPEND
45 #define main_activity_LocalSocketClientActivity_MODE_APPEND 32768L
46 #undef main_activity_LocalSocketClientActivity_MODE_MULTI_PROCESS
47 #define main_activity_LocalSocketClientActivity_MODE_MULTI_PROCESS 4L
48 #undef main_activity_LocalSocketClientActivity_BIND_AUTO_CREATE
49 #define main_activity_LocalSocketClientActivity_BIND_AUTO_CREATE 1L
50 #undef main_activity_LocalSocketClientActivity_BIND_DEBUG_UNBIND
51 #define main_activity_LocalSocketClientActivity_BIND_DEBUG_UNBIND 2L
52 #undef main_activity_LocalSocketClientActivity_BIND_NOT_FOREGROUND
53 #define main_activity_LocalSocketClientActivity_BIND_NOT_FOREGROUND 4L
54 #undef main_activity_LocalSocketClientActivity_BIND_ABOVE_CLIENT
55 #define main_activity_LocalSocketClientActivity_BIND_ABOVE_CLIENT 8L
56 #undef main_activity_LocalSocketClientActivity_BIND_ALLOW_OOM_MANAGEMENT
57 #define main_activity_LocalSocketClientActivity_BIND_ALLOW_OOM_MANAGEMENT 16L
58 #undef main_activity_LocalSocketClientActivity_BIND_WAIVE_PRIORITY
59 #define main_activity_LocalSocketClientActivity_BIND_WAIVE_PRIORITY 32L
60 #undef main_activity_LocalSocketClientActivity_BIND_IMPORTANT
61 #define main_activity_LocalSocketClientActivity_BIND_IMPORTANT 64L
62 #undef main_activity_LocalSocketClientActivity_BIND_ADJUST_WITH_ACTIVITY
63 #define main_activity_LocalSocketClientActivity_BIND_ADJUST_WITH_ACTIVITY 128L
64 #undef main_activity_LocalSocketClientActivity_CONTEXT_INCLUDE_CODE
65 #define main_activity_LocalSocketClientActivity_CONTEXT_INCLUDE_CODE 1L
66 #undef main_activity_LocalSocketClientActivity_CONTEXT_IGNORE_SECURITY
67 #define main_activity_LocalSocketClientActivity_CONTEXT_IGNORE_SECURITY 2L
68 #undef main_activity_LocalSocketClientActivity_CONTEXT_RESTRICTED
69 #define main_activity_LocalSocketClientActivity_CONTEXT_RESTRICTED 4L
70 #undef main_activity_LocalSocketClientActivity_RESULT_CANCELED
71 #define main_activity_LocalSocketClientActivity_RESULT_CANCELED 0L
72 #undef main_activity_LocalSocketClientActivity_RESULT_OK
73 #define main_activity_LocalSocketClientActivity_RESULT_OK -1L
74 #undef main_activity_LocalSocketClientActivity_RESULT_FIRST_USER
75 #define main_activity_LocalSocketClientActivity_RESULT_FIRST_USER 1L
76 #undef main_activity_LocalSocketClientActivity_DEFAULT_KEYS_DISABLE
77 #define main_activity_LocalSocketClientActivity_DEFAULT_KEYS_DISABLE 0L
78 #undef main_activity_LocalSocketClientActivity_DEFAULT_KEYS_DIALER
79 #define main_activity_LocalSocketClientActivity_DEFAULT_KEYS_DIALER 1L
80 #undef main_activity_LocalSocketClientActivity_DEFAULT_KEYS_SHORTCUT
81 #define main_activity_LocalSocketClientActivity_DEFAULT_KEYS_SHORTCUT 2L
82 #undef main_activity_LocalSocketClientActivity_DEFAULT_KEYS_SEARCH_LOCAL
83 #define main_activity_LocalSocketClientActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
84 #undef main_activity_LocalSocketClientActivity_DEFAULT_KEYS_SEARCH_GLOBAL
85 #define main_activity_LocalSocketClientActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
86 /*
87  * Class:     main_activity_LocalSocketClientActivity
88  * Method:    startHeartBeat
89  * Signature: ()I
90  */
91 JNIEXPORT jint JNICALL Java_main_activity_LocalSocketClientActivity_startHeartBeat
92   (JNIEnv *, jobject);
93 
94 #ifdef __cplusplus
95 }
96 #endif
97 #endif
复制代码

客户端native方法实现:

复制代码
  1 /* 头文件begin */
  2 #include "main_activity_LocalSocketClientActivity.h"
  3 
  4 #include <sys/socket.h>
  5 #include <sys/un.h>
  6 #include <stddef.h>
  7 #include <string.h>
  8 /* 头文件end */
  9 
 10 #ifdef __cplusplus
 11 extern "C" {
 12 #endif
 13 
 14 /*
 15  * Class:     main_activity_LocalSocketClientActivity
 16  * Method:    startHeartBeat
 17  */
 18 JNIEXPORT jint JNICALL Java_main_activity_LocalSocketClientActivity_startHeartBeat(JNIEnv * env, jobject object)
 19 {
 20     int socketID;
 21     struct sockaddr_un serverAddr;
 22     char path[] = "pym_local_socket\0";
 23     int ret;
 24 
 25     socketID = socket_local_client(path, ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM);
 26     if (socketID < 0)
 27     {
 28         return socketID;
 29     }
 30 
 31     ret = close(socketID);
 32     if (ret < 0)
 33     {
 34         return CLOSE_ERR;
 35     }
 36 
 37     return NO_ERR;
 38 }
 39 
 40 /* 创建本地socket客户端 */
 41 int socket_local_client(const char *name, int namespaceId, int type)
 42 {
 43     int socketID;
 44     int ret;
 45 
 46     socketID = socket(AF_LOCAL, type, 0);
 47     if(socketID < 0)
 48     {
 49         return CREATE_ERR;
 50     }
 51 
 52     ret = socket_local_client_connect(socketID, name, namespaceId, type);
 53     if (ret < 0)
 54     {
 55         close(socketID);
 56 
 57         return ret;
 58     }
 59 
 60     return socketID;
 61 }
 62 
 63 /* 连接到相应的fileDescriptor上 */
 64 int socket_local_client_connect(int fd, const char *name, int namespaceId, int type)
 65 {
 66     struct sockaddr_un addr;
 67     socklen_t socklen;
 68     size_t namelen;
 69     int ret;
 70 
 71     ret = socket_make_sockaddr_un(name, namespaceId, &addr, &socklen);
 72     if (ret < 0)
 73     {
 74         return ret;
 75     }
 76 
 77     if(connect(fd, (struct sockaddr *) &addr, socklen) < 0)
 78     {
 79         return CONNECT_ERR;
 80     }
 81 
 82     return fd;
 83 }
 84 
 85 /* 构造sockaddr_un */
 86 int socket_make_sockaddr_un(const char *name, int namespaceId, struct sockaddr_un *p_addr, socklen_t *socklen)
 87 {
 88     size_t namelen;
 89 
 90     MEM_ZERO(p_addr, sizeof(*p_addr));
 91 #ifdef HAVE_LINUX_LOCAL_SOCKET_NAMESPACE
 92 
 93     namelen  = strlen(name);
 94 
 95     // Test with length +1 for the *initial* '\0'.
 96     if ((namelen + 1) > sizeof(p_addr->sun_path))
 97     {
 98         return LINUX_MAKE_ADDRUN_ERROR;
 99     }
100     p_addr->sun_path[0] = 0;
101     memcpy(p_addr->sun_path + 1, name, namelen);
102 
103 #else
104 
105     namelen = strlen(name) + strlen(FILESYSTEM_SOCKET_PREFIX);
106 
107     /* unix_path_max appears to be missing on linux */
108     if (namelen > (sizeof(*p_addr) - offsetof(struct sockaddr_un, sun_path) - 1))
109     {
110         return NO_LINUX_MAKE_ADDRUN_ERROR;
111     }
112 
113     strcpy(p_addr->sun_path, FILESYSTEM_SOCKET_PREFIX);
114     strcat(p_addr->sun_path, name);
115 
116 #endif
117 
118     p_addr->sun_family = AF_LOCAL;
119     *socklen = namelen + offsetof(struct sockaddr_un, sun_path) + 1;
120 
121     return NO_ERR;
122 }
123 
124 #ifdef __cplusplus
125 }
126 #endif
复制代码

注意到100~101行比较特殊,是从p_addr->sun_path[1]开始拷贝本地域名,这就是之前为什么一直connect不上的原因,至于为什么偏移1个字节来拷贝本地域名,你可以在*nix系统下输入"man 7 unix"来找到原因。

  先启动server,再启动client就可以看到结果了。对了,在成功创建并已自动连接后,我并未发送任何数据,其实发送数据就是写入文件,It's your trun now! 在close之前加入这段代码吧~

1 int ret;
2 char buf[] = "hello";
3 
4 ret = write(socketID, buf, strlen(buf));

 

 



其他相关介绍 :

http://blog.youkuaiyun.com/xbalien29/article/details/8765235

http://blog.youkuaiyun.com/xiexh0921/article/details/7513628


保姆级教程:用Node-RED把传感器数据推送到ThingsBoard(含MQTT配置避坑) 本文提供了一份详细的Node-RED与ThingsBoard集成教程,帮助开发者快速构建物联网数据管道。从环境准备到MQTT配置避坑,再到数据流编排和高级功能实现,手把手指导完成传感器数据推送全流程。特别适合智能家居和工业物联网项目的快速原型开发。 阅读详情

相关推荐

LocalServerSocket

LocalSocket、LocalServerSocket的简单小Demo。

LocalSocket,Socket/ Websocket/ Http,P2P等网络编程(步骤)(Demo)

所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.Socket有两种主要的操作方式:面向连接(TCP)的和无连接的(UDP,DatagramSocket)。Java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。 sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(S...

ShareUs的专栏 3540

STM32G474实战:数字LLC电源控制程序从零到跑通(附完整代码解析)

本文详细介绍了基于STM32G474微控制器开发数字LLC电源控制程序的完整实战流程。从硬件平台搭建、CubeMX工程配置,到核心控制逻辑、双速率中断框架、数字PID实现,再到Burst模式、状态机等高级策略与异常处理,提供了从零到跑通的系统化指南与代码解析,助力开发者掌握高效数字电源的程序编写与调试技巧。

s1t2u3的博客 1237

java local socket_Android利用LocalSocket实现Java端进程与C端进程之间的IPC

Android是建立在Linux之上的OS,在涉及到安全、网络协议、文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需要打通Java端进程和C端进程,使之能高效地通信。这样,C端进程用于实现功能,Java端进程负责UI、功能的触发及结果处理就可以了。对于*nix系统来说,“一切皆为文件”,Socket也不例外,Soc...

weixin_35501677的博客 759

Linux DRM驱动实战:手把手教你用drmModeSetCrtc显示纯色画面(附完整代码)

本文提供了一份完整的Linux DRM驱动实战指南,手把手教你使用drmModeSetCrtc在屏幕上显示纯色画面。文章详细解析了从打开设备、获取资源、创建帧缓冲区到最终提交画面的完整调用流程,并附带了可直接编译运行的完整代码示例,帮助开发者快速上手Linux图形底层开发。

weixin_29216353的博客 510

从Excel到‘一张图’办案:手把手教你用AbutionGraph构建公安经侦知识图谱(含数据建模避坑指南)

本文详细介绍了如何利用AbutionGraph时序图数仓技术,将公安经侦领域的Excel、银行流水等碎片化数据转化为可交互的知识图谱。通过数据清洗、实体关系模型设计、时序数据处理等步骤,实现高效智能分析,提升办案效率。特别包含数据建模避坑指南和实战案例,助力公安金融案件侦破。

weixin_33702545的博客 341

java c ipc_Android利用LocalSocket实现Java端进程与C端进程之间的IPC

Android是建立在Linux之上的OS,在涉及到安全、网络协议、文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需要打通Java端进程和C端进程,使之能高效地通信。这样,C端进程用于实现功能,Java端进程负责UI、功能的触发及结果处理就可以了。对于*nix系统来说,“一切皆为文件”,Socket也不例外,Soc...

weixin_28366053的博客 154

Ubuntu 20.04 + CARLA 0.9.13 长时运行崩溃?手把手教你定位和缓解Segmentation fault

本文详细解析了Ubuntu 20.04环境下CARLA 0.9.13仿真平台长时运行崩溃问题,提供了从内存监控到核心转储分析的系统级诊断方法,并分享内存泄漏缓解、稳定性优化配置等实用解决方案,帮助开发者构建更稳定的自动驾驶仿真环境。

weixin_28362173的博客 252

IPC socket android localsocket

一、基础概念 IPC: 进程间通信; soket: 通信机制。封装tcp/ip协议,提供通信接口; ipc socket通信媒介有以下几种: 网络端口、文件系统、内存映射 domain socket https://blog.youkuaiyun.com/guxch/article/details/7041052 1、address family为AF_UNIX 2、用文件路径表示地址:地址格式不...

Jiiaaaoooo的博客 498

UG\NX二次开发 获取三平面交点

//如果返回值不为0 则此三个面没交点 int three_faces_point(tag_t tagFace1, tag_t tagFace2, tag_t tagFace3, double *dou_x, double *dou_y, double *dou_z)

王牌飞行员_里海的博客 674

投稿前利用GPT-5.5给论文做一次深度校对,投稿命中率翻倍!

3)一致性:请对比摘要的结论与正文(如果我也提供了正文),确保完全一致。请严格检查结果部分,确保客观性:1)纯粹性检查:标出所有包含“为什么”(解释)或“这意味着什么”(暗示)的主观语句,这些应移至讨论部分。请你帮我评估讨论部分的深度:1)解释与对比:检查每一项主要结果是否都解释了原因,并引用了前人研究进行对比(一致或相悖)。我见过太多人把校对理解为检查错别字了,实际上,校对要看的远不止这个,像逻辑是否连贯、术语是否前后一致、图表有没有被正确引用等等的这些细节,往往决定了文章是秒被拒,还是能顺利进入外审。

智能AI让学术科研更容易 412

你可能没听过的LocalSocket

相信大家对Socket都不陌生,但是对于是什么,可能就不太了解了,笔者也是孤陋寡闻,第一次听说这个,起因是在项目中用到这个东西,感觉很新奇,于是学习了一波将其记录下来。探索过程发现Android系统中也有多处使用了它,写着写着就有了这篇较为深入的文章。LocalSocket是个啥通过LocalSocket实现通信过程从源码角度分析进程是如何通过实现与Zygote进程通信的如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。

大模型训练 1355

YOLO126优化:损失篇 | AAAI 2025 | 一种基于尺度的动态(SD)损失,根据目标大小动态调整尺度和位置损失的影响,提高了网络检测不同尺度目标的能力

提出了一种基于尺度的动态(SD)损失,它根据目标大小动态调整尺度和位置损失的影响,提高了网络检测不同尺度目标的能力。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 444

java socket跨进程通信,Android跨进程通信-socket

Socket的使用和原理socket套接字本来是设计给基于TCP/IP协议的网络通信使用的,但由于它是一种C/S架构模型,即客户端服务器端架构,这种模型能带来很大的安全性以及快速的响应能力,所以也常常用在进程之间的通信上。Socket的使用方式比上面前面提到的其他IPC都要复杂很多,我们先通过下图了解它的使用流程。236c1533b78642b5bf5e3d6c5959b12e_tplv-k3u1...

weixin_39949607的博客 293

三维点云转深度图

点云投影过程是将三维点云数据转化为二维图像坐标的关键步骤,它的实现涉及到相机内外参数的计算,包括相机的内部参数(如焦距和主点)和外部参数(如相机位置和方向)。具体来说,可以通过将每个点的三维坐标转换为相机坐标系下的坐标,然后使用相机内部参数和外部参数来计算在二维图像中的坐标。接着计算每个点的深度值,将深度值映射到像素值上,最后创建深度图像并将深度值赋给对应的像素值。这里需要注意的是,在将深度值映射到像素值上时,需要将像素值转换为 uchar 类型,否则在将深度值赋给像素值时会出现类型不匹配的错误。

点云兔子的博客 3171

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Binder 与 LocalSocket:Android 中两种 “Socket” 通信的适用场景

特性Binder适用层级框架层/应用层 IPC底层进程间通信数据量限制≤1MB(需分片处理)无硬限制数据传输类型结构化对象(Parcelable)原始字节流/文件描述符典型用例Activity 绑定 ServiceZygote 通信、ADB 守护进程安全性内置权限校验需自行实现校验机制开发复杂度低(AIDL 自动生成代码)高(需手动管理协议和线程)

2501_94067290的博客 336

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: Android捕获错误信息发送至服务器
下一篇: Android SoftAp支持
androidboy365
博客等级 码龄16年 35粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值