Android Framework实战开发-socket跨进程通信之native程序与apk java通信

Android系统开发工程师核心技术栈与面试指南 Android系统开发是移动互联网领域的核心技术方向,涉及Linux内核、硬件抽象层(HAL)和Framework等底层架构。其核心原理包括进程调度、内存管理和Binder通信机制,这些技术支撑着Android系统的稳定运行和高性能表现。在工程实践中,系统开发工程师需要掌握JNI调用、SeLinux策略配置等Native开发技能,并能熟练使用adb命令进行性能调优。典型的应用场景包括系统启动优化、界面渲染卡顿分析和内存泄漏排查等。随着Android系统不断演进,对ART虚拟机、SurfaceFlinger等 阅读详情
AI摘要

本文详细讲解了如何在Android平台上实现C++ native服务端通过Unix Socket与Java应用的通信,包括服务器端的设置、监听和客户端的连接发送操作,适合iOS开发者了解跨进程通信实践。

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论

android跨进程通信实战视频课程(加群获取优惠)

unix socket前面几节课已经讲过了,但都是基于linux下面的c程序,那么在android中往往经常会遇到c代码的native程序要与
apk的java程序进行socket通信,本节课我们来实现一下:
直接上代码:
native端作为服务端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/epoll.h>
#include <sys/un.h>
int main()
{
    char *socket_path = "server-socket";
    struct sockaddr_un serun, cliun;
    socklen_t cliun_len;
    int listenfd, connfd, size;
    char buf[80];
    int i, n;
    if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("socket error");
        exit(1);
    }
    //unlink(socket_path);
    memset(&serun, 0, sizeof(serun));
    serun.sun_family = AF_UNIX;
    serun.sun_path[0] = 0;
    strcpy(serun.sun_path+1,socket_path);
    socklen_t addrlen_ = sizeof(serun.sun_family) + strlen(socket_path) + 1;
    int ret = bind(listenfd, (struct sockaddr*)&serun,addrlen_);
    if(ret == -1)
    {
        perror("bind");
        exit(0);
    }
    // 3. 监听
    ret = listen(listenfd, 20);
    if(ret == -1)
    {
        perror("listen");
        exit(0);
    }

   
    while(1)
    {
	printf("wait connect...\n");
	socklen_t l =   sizeof(struct sockaddr_un);
        int connfd = accept(listenfd, (struct sockaddr *)&cliun, &l);
        if(connfd == -1)
        {
            perror("accept");
            exit(-1);
        }
        printf("a new client connected! ");
    
        int count = read(connfd, buf, sizeof(buf));
        if(count == 0)//客户端关闭了连接
        {
            printf("客户端关闭了连接。。。。\n");
          
        }
        else
        {
            if(count == -1)
            {
                perror("read");
                exit(-1);
            }
            else
            {
                //正常通信
                printf("client say: %s\n" ,buf);
		write(connfd,"received ok",sizeof("received ok"));
            }
        }
    }
    close(listenfd);
    return 0;
}

apk端的java代码作为客户端:
只展示核心部分:

  private void sendMessage() {
        try {
            lsocket = new LocalSocket();
            LocalSocketAddress address = new LocalSocketAddress("server-socket", LocalSocketAddress.Namespace.ABSTRACT);
            lsocket.connect(address);
            String result;
            Log.i("test","rootclient send cmd to rootServer cmd = " + sendCmdText.getText().toString());
            br = new BufferedWriter(new OutputStreamWriter(lsocket.getOutputStream()));
            br.write(sendCmdText.getText().toString());
            br.newLine();
            br.flush();
//            br.close();

            Log.d("test", "========发送成功========");
            InputStream inputStream = lsocket.getInputStream();
            BufferedReader buffer = null;
            buffer = new BufferedReader(new InputStreamReader(inputStream));
            String tmpStr = null;
            while(inputStream.available() == 0) {
                try {
                //    Log.d("lsm", "========sleep======== inputStream.available() = " +inputStream.available());
                    Thread.sleep(1);
                }catch (Exception e) {

                }
            }
            byte[] buf = new byte[inputStream.available() -1];
            inputStream.read(buf,0,inputStream.available() -1) ;
            String str =new String(buf);
            Log.d("test", "========接受成功======== inputStream.available() = " +inputStream.available() + "read str  = " +str);
            final String str1 = str;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    receiveText.setText(str1);
                }
            });

            buffer.close();

            lsocket.close();
        } catch (IOException e) {
            e.printStackTrace();
            Log.i("test","rootclient rootServer 发送失败",e);
        }
    }

ps:完整代码课程中会进行提供和讲解

从OHA到FileProvider:Android开放生态的技术遗产与演进之路 移动操作系统的成败,往往取决于其底层生态的开放程度与治理策略。从Google牵头成立开放手持设备联盟(OHA)并公开初代Android系统开始,开源与联盟模式便成为Android与封闭生态抗衡的核心武器。这种模式不仅催生了AOSP与Android Framework的持续迭代,也让开发者工具链从Eclipse插件演进为今日的Android Studio和Gradle体系。与此同时,开放带来的碎片化问题逐步显现,从系统版本分化到存储权限混乱,Google通过FileProvider、Scoped Storag 阅读详情

相关推荐

ovs实现lb负载均衡

负载均衡器的实现原理是通过硬件或软件设备将客户端访问流量根据转发策略分发到多个服务器或设备上,以确保系统的负载均衡。二层负载均衡‌:使用虚拟MAC地址方式,根据OSI模型的二层进行负载均衡。‌四层负载均衡‌:基于IP+端口的负载均衡,主要分析IP层及TCP/UDP层,实现四层负载均衡。‌七层负载均衡‌:从应用层开始,根据虚拟的URL或IP、主机名接收请求,再转向相应的处理服务器。

bobi的博客 952

Android 9及高版本使用socketIO无法连接服务器通信

在开发过程中安卓端使用socketIO和服务器进行通信, 但是开始适配Android 9及更高版本时发现同样的代码, 获取到socket后使用conn.connect()无法连接到服务器, 为此还专门在github上提了一个issue, 没想到作者给我回复了邮件探讨了此问题, 后来我找到了原因, 是因为从Android 9开始, 所有的网络通信都要使用https协议, 而socketIO使用的http协议进行通信 (当然也可以自己在服务器上搭建https服务进行通信), 为此我修改了Andr...

phoenix3k的博客 1765

104报文解析工具

可选择包含报文的文本文件或日志文件进行解析,可选择按条数范围或时间范围,输出结果可以在报文解析显示区,也可以输出到文件。可以对文本内容的报文文件进行高级分析,包括遥信遥测等通讯数据的具体信息,通讯帧的统计,通讯次数的统计,各种错误的分析,报文的定位功能,传输的文件具体内容等。输入完成后点击工具栏的解析报文按钮或使用右键菜单的解析就可以对报文进行解析。在报文输入区输入待解析报文并解析后,解析结果就显示在报文解析显示区和报文定位展示区及报文定位条目区。当有多条报文解析后,可以通过报文列表树具体定位某条报文。

XZHOUMIN的博客 5949

Android利用JNI通过Socket与服务器进行通信

不多说,先上代码。记得点击star哦,代码地址是:SocketDemo 上一篇文章写了如何通过Java层实现Socket和服务器的Socket进行通信,这一篇继续深究,写个如何通过native层实现socket和服务器进行通信。服务器端代码和前一篇博客代码一致,主要看下Android端的代码。首先看下Main2Activity的代码: Main2Activity.java package com.zqc.socketdemo; import android.app...

u011652925的博客 901

SMIC Memory配置与Library Compiler实战:从lib到db的高效转换

本文详细介绍了SMIC Memory Compiler的配置要点与使用Library Compiler将.lib文件高效转换为.db文件的完整流程。文章深入解析了关键配置参数对性能和面积的影响,并提供了从交互式操作到自动化脚本的实战指南,帮助数字芯片设计工程师顺利完成存储器模型的生成与集成,确保Design Compiler能正确调用。

weixin_28314575的博客 335

不到200块!手把手教你用ZYNQ7010和AD9363攒一台自己的开源SDR硬件(附BOM清单)

本文详细介绍了如何用不到200元的预算,基于ZYNQ7010 FPGA和AD9363射频芯片打造一台功能完备的开源SDR硬件平台。从核心组件选型、PCB设计到焊接调试,提供全流程实战指南,特别适合预算有限的硬件爱好者和创客群体探索无线通信世界。

weixin_26854829的博客 479

Android Java层和Native层通信实战大荟萃之LocalSocket实现通信

      Android和C/C++通过LocalSocket实现通信   前面篇章Android和C/C++通过原生socket实现通信介绍了使用原生Socket实现Android和C/C++之间的通信方式,这种方式虽然简单,但是效率并不是很高(但是也并不是一无是处,可以实现跨终端跨网络的通信)。所以Android的妈咪谷歌为我们带来了LocalSocket,比Java本身的socket效率要...

IT先森 4324

引以为戒:一个“看不见”的空格,导致上下文超限——从 `llama-server` 错误说起

文章摘要: 本文分享了Qwen工程团队在部署llama-server时遇到的参数失效问题:明明设置了-c 32768上下文参数,却仍报错"超出4096 tokens限制"。经排查发现,问题根源是批处理脚本中续行符^后存在两个空格,导致参数被忽略。文章详细解析了Windows批处理中^的严格语法规则(必须紧贴前字符),对比了错误与正确写法的差异,并给出4条实用建议:使用编辑器显示空白字符、调试时关闭@echo off、预检完整命令、优先单行命令。最后强调在AI系统部署中,此类"隐

刘一说的IT专栏 541

netty系列之:在netty中使用native传输协议

对于IO来说,除了传统的block IO,使用最多的就是NIO了,通常我们在netty程序中最常用到的就是NIO,比如NioEventLoopGroup,NioServerSocketChannel等。 我们也知道在IO中有比NIO更快的IO方式,比如kqueue和epoll,但是这两种方式需要native方法的支持,也就是说需要在操作系统层面提供服务。 如果我们在支持Kqueue或者epoll的服务器上,netty是否可以提供对这些优秀IO的支持呢? 答案是肯定的。但是首先kqueue和epoll需

weixin_68320784的博客 503

QT+Halcon实现螺纹检测

工业上要检测螺丝的内外直径、内外牙距、内外角度,现在比较好用的图像处理库,开源的opencv,收费的有halcon。为了实现螺纹检测,和对比螺纹检测拿个库比较好。分别用opencv和halcon实现了螺纹检测,通过对比发现用halcon实现的效果比较。现在用博客把实现过程记录下来: 1、需要检测的螺纹数据如下: 2、为了实现检测螺丝以上数据,螺纹内径、螺纹外径、螺纹外牙距、螺纹...

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 7050

华为OD机试新系统真题 【查找最佳充电策略】

华为OD机试 新系统真题【查找最佳充电策略】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找最佳充电策略】多语言题解。

qq_45776114的博客 432

Android 13 添加native进程LocalSocket,并添加SELinux权限

native socket server SELinux

qq_34694875的博客 1395

车载ECU底软测试:方法与技术的深度解析

底软是运行在 ECU 硬件平台上的基础软件,它为上层应用程序提供了硬件驱动、操作系统服务、通信协议栈等功能。底软的主要功能包括:硬件驱动:负责与 ECU 的各种硬件外设进行通信和控制,如 GPIO、UART、SPI、CAN 等。操作系统服务:提供任务调度、内存管理、中断处理等功能,确保系统的实时性和稳定性。通信协议栈:实现 ECU 与其他 ECU 或外部设备之间的通信,如 CAN、LIN、FlexRay 等。诊断服务:负责对 ECU 的故障进行诊断和处理,并将故障信息存储在故障码存储器中。

天赐好车的博客 1428

千里马Android Framework实战开发-跨进程通信专题博客总结

千里马Android Framework实战开发-跨进程通信专题课表介绍 因为课程还剩下最后一部分binder驱动没有讲完,但是粉丝同学们已经迫不及待想要要提前看,这里就先分享一个课表给大家,提醒一下,课表的很大,你忍一下。。。。。 预计一星期左右可以上线全部视频,大家敬请期待课程杀青 ...

learnframework的博客 4279

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android Framework从入门到精通:核心机制与实战路径全解析

在Android系统架构中,Framework层是连接应用与硬件的关键桥梁,也是决定系统性能、稳定性与扩展能力的技术核心。它通过Binder机制实现高效的跨进程通信,由AMS、WMS、PMS等系统服务协同管理组件生命周期、窗口布局与权限校验,同时借助SurfaceFlinger完成图形合成与渲染。理解这些底层原理,能够帮助开发者精准定位应用启动慢、卡顿掉帧、权限异常等疑难问题。无论是进行系统级定制、性能优化还是兼容性适配,掌握Framework的核心脉络都至关重要。本文以一线工程师的视角,梳理了从源码获取、

weixin_34034261的博客 346

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android 知识体系

Android归档前言 前言 感谢: Gityuan:Android系统架构开篇 刘望舒的博客:知识体系

许浑的博客 8199

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android | AIDL通信

文章摘要:本文系统介绍了Android进程间通信(IPC)机制,重点解析了Binder和AIDL的实现原理与应用。内容涵盖进程隔离基础、IPC方式对比(Bundle/Intent、Messenger、AIDL等)、Binder架构的四层模型(应用层、Framework层、内核层、ServiceManager)及其核心特性(一次拷贝、1MB限制)。详细阐述了AIDL开发流程(接口定义、定向Tag、死亡监听)、跨进程回调管理(RemoteCallbackList)以及系统级权限校验机制。最后提出Binder连接

codeSong的博客 380

第一板块:Android 系统基石与运行原理 | 第一篇:Android 系统架构分层与 AOSP 规范

Android系统架构与AOSP规范摘要 Android是基于Linux内核构建的分层操作系统,采用清晰的五层架构设计: Linux内核层:提供进程调度、内存管理、驱动支持等基础功能,包含Binder等Android特有组件 硬件抽象层(HAL):通过标准C接口屏蔽硬件差异,实现驱动与上层解耦 系统运行库层:包含Native库和ART运行时,执行核心功能与字节码 Java API框架层:以系统服务形式暴露核心功能给应用 应用层:运行在独立沙箱中的各类应用 各层间定义清晰的接口边界,通过JNI、HAL标准接口

9年Android老兵,专注车载系统与移动架构。深耕Java/Kotlin,玩转Lua/Python。擅长百度/高德地图深度定制,分享拒绝浅尝辄止的硬核干货。 709

Android开发实战:从环境搭建到性能优化全攻略

Android开发作为移动应用开发的核心领域,其技术栈涵盖从基础环境搭建到高级架构设计的完整体系。理解Android Studio配置、Gradle构建系统以及ADB调试工具的原理,是提升开发效率的关键。在工程实践中,内存泄漏检测、启动速度优化等性能调优技术直接影响用户体验,而MVVM架构、跨进程通信等方案则关系到应用的可维护性。随着Kotlin和Jetpack Compose的普及,现代Android开发更强调声明式UI和响应式编程。本指南基于十余年实战经验,系统梳理了环境配置、框架设计、性能优化等核心知

457

Vector Framework 解析:基于 Zygisk 的现代 ART Hook 框架安装、兼容性与架构实现

Vector 是一个以 Zygisk 模块形态分发的 Android ART Hook 框架(modern Xposed Framework),其目标是在保持与原版 Xposed API 兼容的前提下,为 Android 8.1 至 Android 17 Beta 设备提供稳定、原生级的进程内插桩能力。本文以仓库根目录 [README.md](https://link.gitcode.com/i/

gitblog_00084的博客 878

揭秘安卓系统架构:从内核到应用全解析

Android操作系统是基于Linux内核的开源移动操作系统,采用分层架构设计。其核心组件包括:Linux内核负责硬件资源管理;硬件抽象层(HAL)统一硬件接口;原生库提供核心功能支持;Android运行时(ART)执行应用代码;应用框架层为开发者提供API;系统应用和用户应用分别提供基础功能和扩展服务。这种层次化设计实现了软硬件解耦,确保了系统的稳定性和可扩展性。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 2590

Android面试全攻略:从Java基础到架构设计,助你斩获心仪Offer

在移动开发领域,扎实的技术基础和清晰的架构思维是开发者职业发展的核心。理解计算机基础原理,如JVM内存模型与垃圾回收机制,是构建高性能应用的基石。掌握Android平台核心技术,包括四大组件生命周期、View渲染流程及事件分发机制,能有效解决UI卡顿等性能问题。在工程实践中,性能优化和架构设计体现了开发者的综合能力,例如通过启动优化、内存管理及合理的组件化方案,可以显著提升应用质量与团队协作效率。这些技术最终服务于构建稳定、高效的大型应用,也是当前Android面试中的高频考点和深度考察方向。

weixin_33692284的博客 384

Android Launcher启动全流程解析:从Zygote到桌面渲染

Launcher是Android系统中承载所有App入口的核心Home Activity,其启动过程本质是系统服务就绪后首个跨进程Activity调度的完整链路。它依赖Zygote进程孵化机制实现类预加载与内存共享,通过Binder与ActivityManagerService、PackageManagerService、WindowManagerService等关键系统服务完成三次握手式绑定,并基于Intent匹配规则扫描并构建桌面图标列表。该流程直接决定冷启动性能、图标可见性与点击响应性,广泛应用于RO

weixin_34268310的博客 750
上一篇: Android Framework实战开发-Socket让app实现shell命令行执行
下一篇: Android Framework实战开发-socketpair介绍及它在android系统源码使用分析
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值