編輯:關於Android編程
一般的native和framework的通信是通過jni,但是這一般只是framework調用native,native如果有消息要怎樣通知上層 呢?android中GSP模塊提供一種解決思路,但是實現有些復雜,這裡介紹一種使用socket通信的方法可以使native和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通信的實現方法 ,實現一個模擬後台數據登入的效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對本站網站的支持!
臨近畢業,各種事情各種忙。我也沒有認真專注寫過博客,最近仔細看了Volley框架的使用及其源碼,思前想後,想挑戰一下自己,還是寫一篇博客來分享,如有錯誤,歡迎吐槽。Vol
Android的屏幕適配一直以來都在折磨著我們這些開發者,本篇文章以Google的官方文檔為基礎,全面而深入的講解了Android屏幕適配的原因、重要概念、解決方案及最
在Android中復雜的圖形的繪制絕大多數是通過path來實現,比如繪制一條曲線,然後讓一個物體隨著這個曲線運動,比如搜索按鈕,比如一個簡單時鐘的實現:那麼什麼是path
要用TextView使用漸變色,那我們就必須要了解LinearGradient(線性漸變)的用法。LinearGradient的參數解釋LinearGradient也稱作