国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中使用socket使底層和framework通信的實現方法

2020-02-21 17:30:03
字體:
來源:轉載
供稿:網友

通常,本機和框架之間的通信是通過JNI進行的,但這只是調用本機的框架,安卓系統中的GSP模塊提供了一個解決方案,但其實現有些復雜,本文是Android中使用socket使底層和framework通信的實現方法。

android中使用jni對linux中的socket進行了封裝。使用起來十分的方便。

由于android是基于linux的,所以linux的代碼會在java之前先執行,所以一般native端是服務器。framework端是客戶端。

java層主要代碼:

view sourceprint?LocalSocket s =null;LocalSocketAddress l;s = new LocalSocket();l = new LocalSocketAddress(SOCKET_NAME,LocalSocketAddress.Namespace.RESERVED);s.connect(l);

到此時如果socket連接沒有問題,就可以像正常的讀寫了。

native層主要代碼:

view sourceprint?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通信的實現方法,實現了模擬背景數據輸入的效果。希望對你有幫助。非常感謝您對武林技術頻道的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 井陉县| 岐山县| 桦南县| 江阴市| 蛟河市| 柳江县| 蒙阴县| 方山县| 涞源县| 霍林郭勒市| 南江县| 辉县市| 呼图壁县| 武威市| 白银市| 合川市| 图们市| 三穗县| 石柱| 河曲县| 崇左市| 龙门县| 珠海市| 遂宁市| 博白县| 新巴尔虎左旗| 离岛区| 贵阳市| 新宁县| 鄱阳县| 赤城县| 永丰县| 苗栗市| 邹城市| 安岳县| 宁明县| 滕州市| 临武县| 宾阳县| 开化县| 桓台县|