android使用socket使底層和framework通訊

來源:互聯網
上載者:User

一般的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寫一個用戶端程式即可。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.