`
java_cofi
  • 浏览: 48965 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android 中使用socket使native和framework通信

阅读更多
一般的native和framework的通信是通过jni,但是这一般只是framework调用native,native如果有消息要怎样通知上层呢?android中GSP模块提供一种解决思路,但是实现有些复杂,这里介绍一种使用socket通信的方法可以使native和framework自由通信,具体实现如下:
android中使用jni对linux中的socket进行了封装。使用起来十分的方便。
由于android是基于linux的,所以linux的代码会在java之前先执行,所以一般native端是服务器。framework端是客户端。
java层主要代码:
LocalSocket s =null;
LocalSocketAddress l;
s = new LocalSocket();
l = new LocalSocketAddress(SOCKET_NAME,LocalSocketAddress.Namespace.RESERVED);
s.connect(l);
到此时如果socket连接没有问题,就可以像正常的读写了。
native层主要代码:
s_fdListen = android_get_control_socket(SOCKET_NAME);
ret = listen(s_fdListen, n);
s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen);
如果连接没有问题就可以使用linux中的write/read来对socket进行读和写了;
这里有必要解释一下SOCKET_NAME,它的值是一个字符串,它在init.rc中定义的一个字符串。也就是说,我们可以通过修改init.rc中来申请我们需要的socket资源。
这里以ril为例来说明:
service ril-daemon /system/bin/rild
socket rild stream 660 root radio
socket rild-debug stream 660 radio system
user root
group radio cache inet misc audio

以上是摘自android 2.2 源码中的system\core\rootdir\init.rc中的片段。至于其具体含义可以参见init.c和system/core/init/readme.txt文件。他的作用是由init.c来解析init.rc,并为我们启动一个名为rild的守护进程,它是一个可执行程序,我们通过adb shell在system/bin中可以找到对应的rild文件。socket表示为这个守护进程分配一个socket资源,这个socket资源可以在/dev/socket/下找到rild。也就是本文要这里最关键的地方,socket能不能通就看守护进程能不能很好的起来。上面SOCKET_NAME也就是这里定义的字符串(在ril.java和ril.cpp中就有一个字符串常量SOCKET_NAME_RIL,他的值就是rild,和上面的对应)。
如果我们要自定义一个socket来进行通信,我们可以在init.rc的最后面加上
service myserver-daemon /system/bin/server
socket server stream 666
oneshot
system/bin/server就是我们编译生成的服务器程序,在里面我们调用
s_fdListen = android_get_control_socket(“server”);
ret = listen(s_fdListen, n);
s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen);java只需要使用最上面的代码就可以和native通信了,注意SOCKET_NAME值必须上下统一和init.rc中的相等,此处为“rild”。这里的oneshot必须有,没有的话,你的server很可能起不来。关于编译可以参考ril中的中的Android.mk和rild.c和ril.cpp,自己把头文件挑出即可。
先用mm编译自己加的模块,编译好后,将添加的模块考出,在源码的根目录下make snod。将编译输出文件加到system.img中。最后将system.img和randisk.img拷到sdk对应的平台中。即可。主要这两个img文件都要拷,system.img中有你的可执行程序,而randisk.img中有你的init.rc。userdata.img不确定。
此时只需要用java写一个客户端程序即可。
此方法本人以亲自验证可用,如需索取测试代码可以留下邮箱。
分享到:
评论

相关推荐

    Android中使用socket使底层和framework通信的实现方法

    android中GSP模块提供一种解决思路,但是实现有些复杂,这里介绍一种使用socket通信的方法可以使native和framework自 由通信,具体实现如下: android中使用jni对linux中的socket进行了封装。使用起来十分的方便。 ...

    Android应用与framework的socket通信实例

    在Android应用与framework的Socket通信中,Android应用作为客户端,而framework作为服务器端。客户端首先需要创建Socket对象,通过指定服务器的IP地址和端口号来建立连接。例如: ```java Socket socket = new ...

    Android应用与framework的socket通信示例

    通过阅读和分析这个文件,我们可以更深入地理解如何在实际项目中实现Android应用与framework层的Socket通信。 总的来说,虽然Android推荐使用Binder机制进行进程间通信,但Socket通信提供了一种灵活的方式,尤其在...

    [Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(一)——服务端

    前言 需求是这样的,system_server有一个Local...1、socket传输效率低,开销大,通信过程中至少有两次拷贝过程; 2、由于1的原因,从system_server调用方法主动获取native进程状态时效性比binder通信差; 3、由于我们使

    安卓串口Socket通讯USB驱动jni相关-PC与Android设备通过USB建立通信连接通过socket收发数据.rar

    在Android设备和PC之间,我们可以建立一个Socket连接,通过USB接口传输数据,从而模拟串口通信。 2. **USB驱动开发**: 在Android中,USB驱动主要涉及Android开放访问框架(Open Accessory Framework,OAF)或USB...

    深入理解Android卷一 文字全彩版

    《深入理解Android》一书的分析模块将遵循Android系统的架构,涵盖了Native层、Java Framework层和Java Application层的内容。Native层包括了系统启动和服务的相关组件(如init、Audio系统、Surface系统、Vold和Rild...

    Android高级工程师面试技术点小结

    - **Android平台下的网络编程**:熟悉HTTP和Socket两种主要的网络通信方式,在Android环境中进行有效的数据传输与交互。 - **移动网络特性**:考虑到移动设备的特殊性,比如网络连接不稳定、带宽限制等问题,掌握...

    深入理解Android 卷Ⅰ卷Ⅱ 邓凡平.zip

    9. **NDK开发**:讲解原生C/C++代码在Android中的应用,包括JNI(Java Native Interface)。 这套书籍的高清扫描版包含了详细的目录,方便读者快速定位所需内容。无论是初学者还是经验丰富的开发者,都能从中获益匪...

    android SDK源代码,压缩版,经典耐看,开发必备

    开发者可以通过分析源码来发现潜在的优化点,理解和修复bug,以及创新性地使用Android系统提供的功能。这份压缩版的源码虽然可能不完整,但对于初学者和有经验的开发者来说,都是一个宝贵的资源。

    android2.0.1源代码

    6. **App Framework**:提供了一系列的 API,供应用开发者使用,如 Activity Manager、Content Provider、Broadcast Receiver 和 Service 等。 7. **Apps**:预装的应用程序,如设置、电话、联系人、浏览器等,它们...

    android源码core文件夹下的文件(包含资源)

    5. **图形与视图系统**:"core/libui"和"core/frameworks/native/opengl"包含了Android的图形和视图系统的实现,包括SurfaceFlinger服务,它负责将多个应用程序的渲染结果合成到屏幕显示,以及OpenGL ES的实现,支持...

    Android 开发文档

    2. **网络通信**:讲解HTTP请求、Socket编程等技术在Android中的应用。 3. **多媒体操作**:包括音频、视频的播放和录制功能实现。 4. **定位服务**:利用GPS或网络提供商提供的位置信息进行应用开发。 ### 四、...

    Android各个层次之间的相互关系

    在Android操作系统中,应用程序的执行和交互涉及到多个层次的组件,这些层次之间的关系构成了Android系统的架构。主要可以分为四个核心层次:应用程序层(App)、应用程序框架层(Runtime Service)、系统运行库层...

    通过usbmassstorage看android系统架构.pdf

    IPC是Android系统中不同进程间通信的关键技术,它涵盖了多种数据交换方式,如消息传递、同步、内存共享和远程过程调用(RPC)。 - **消息发送**:进程间通过消息队列、管道等方式传递数据。 - **同步**:包括...

    android 源码 source15

    Android的网络通信涉及到Socket编程、HTTP/HTTPS协议、WiFi和移动数据网络等。源码分布在system/net、system/bt、system/core/libcutils等目录下,包含了网络配置、连接管理和服务发现等功能。 八、多媒体框架 ...

    Android常见知识点总结

    在Android中,Activity或Fragment可以看作是Controller和View的结合体,而Model通常是业务逻辑层,负责数据的处理。 #### 16. ANR(Application Not Responding)的避免方法 - **限制主线程操作时间**:避免在主线...

    2012最新java面试大全--很有帮助的

    通常使用JNI(Java Native Interface)来实现Java层和原生层之间的通信。此外,还可以使用AIDL(Android Interface Definition Language)来实现跨进程通信。 ### 55. Android系统的垃圾回收机制是什么? Android...

    android-wifi系统架构.rar_android开发_Java__android开发_Java_

    例如,它实现了`wlan`设备节点,使得用户空间程序可以通过标准的网络编程接口(如socket)进行通信。 3. **Android Framework层**:在这个层次,Android提供了一套API,即`WifiManager`服务,用于应用程序访问WiFi...

Global site tag (gtag.js) - Google Analytics