說明一下JNI 與AIDL,說明JNIAIDL

來源:互聯網
上載者:User

說明一下JNI 與AIDL,說明JNIAIDL

代碼在評論中。

JNI:

為什麼需要JNI:

因為android是由【JAVA & C/C++】組成。Java運行在Dalvik虛擬機器中。

沒有辦法直接存取底層硬體。底層HW相關目前技術一般都用C語言,不會用java,C速度也比較快。

怎麼從JAVA語言傳送資料到C語言中:

                         

1. java中會調用native標識的函數,這個函數就是經典了。

2.當然這些native的函數怎麼調用,就得載入一個提供C函數包,叫共用庫(ex:libNewJNI.so)

3.問題來了,這.so檔案怎麼來的? 從一下兩個檔案編譯後產生的(.h & .c/cpp),當然Android.mk中設定編譯選項樓。

  

 4.完成了,很簡單吧。

 

AIDL:

為什麼需要AIDL:

AIDL機制就是處理用戶端和服務端的通訊,通過AIDL機制,用戶端通過調用服務端提供的介面便於跨進程調用其他應用程式.
Service分為本地服務和遠程服務,遠程服務就一定要用到AIDL技術實現,因為android的不同應用是在不同的進程中啟動並執行,

也是彼此獨立的,如果在一個應用中訪問另一個應用,也就是調用遠程服務,就要把服務端定義的AIDL檔案放到用戶端,

這樣才可以實現遠程服務調用。

怎麼從一個進程調動另一個進程:

1.首先AIDL代碼是?

很簡單,尾碼名僅僅是.aidl,內容就是interface class。

2.怎麼用AIDL?

也簡單,就是編譯後aidl檔案就變成了,*.java檔案

開啟檔案看的話,你又明白了,是一個Binder

static abstract class Stub extends android.os.Binder implements android.com.personservice.IPerson

3.用戶端怎麼調用這個Stub(調用server傳來的資料)

private ServiceConnection conn = new ServiceConnection() {        @Override        public void onServiceDisconnected(ComponentName arg0) {        }        // 因為有可能有多個應用同時進行RPC操作,所以同步該方法        @Override        public synchronized void onServiceConnected(ComponentName arg0,                IBinder binder) {            // 獲得IPerson介面            person = IPerson.Stub.asInterface(binder);            if (person != null) {                try {                    // RPC方法調用                    String name = person.getName();                    Toast.makeText(MainActivity.this, "遠程進程調用成功!值為 : " + name,                            Toast.LENGTH_LONG).show();                } catch (RemoteException e) {                    e.printStackTrace();                    Toast.makeText(MainActivity.this, "遠程進程調用失敗! ",                            Toast.LENGTH_LONG).show();                }            }        }    };

4.服務端和用戶端都必須有相同名字aidl檔案嗎?

當然,用戶端包含的interface比服務端少是可以的,

因為服務端是提供interface的,所以必須包含用戶端請求的interface。

5.服務端比用戶端多的是什嗎?
  1) AIDL中的interface 函數

  2) 實作類別,實現aidl產生的抽象類別(aidl編譯產生的java)

  3) 還有一個service類。

6.服務端怎麼賦值給用戶端?

private ServiceConnection conn = new ServiceConnection() {        // 中斷連線時調用        @Override        public void onServiceDisconnected(ComponentName arg0) {        }        // 串連時調用        @Override        public void onServiceConnected(ComponentName arg0, IBinder binder) {            iPerson = IPerson.Stub.asInterface(binder);            if (iPerson != null) {                try {                    iPerson.setName("My name is 'Server AIDL'");                    Toast.makeText(MainActivity.this, "賦值成功!",                            Toast.LENGTH_LONG).show();                } catch (RemoteException e) {                    e.printStackTrace();                    Toast.makeText(MainActivity.this, "賦值失敗!",                            Toast.LENGTH_LONG).show();                }            }        }    };

7.這些IPerson的實現是什嗎?
與一般的實現抽象類別一樣。

public class PersonImpl extends IPerson.Stub {    private String name;    @Override    public String getName() throws RemoteException {        return name;    }    @Override    public void setName(String name) throws RemoteException {        this.name = name;    }}

8. service是?
直接return那個實作類別

public class MyService extends Service {    private Stub iPerson = new PersonImpl();    @Override    public IBinder onBind(Intent arg0) {        Log.i("service", "onBind...");        return iPerson;    }}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.