说到底,Java层的service就是就C++层的binder的封装,所以从原理上来讲通过C++代码直接访问android framework层的service是完全可能的,这篇文章以访问WifiService为例,讲解如何去实现这个功能。
费话少说,直接上代码:
WifiTest.cpp
#include
#include
#include
#include
#include
#include
#include
#include
//#include
#include
#include
using namespace android; #define WIFI_SERVICE "wifi" const String16 WIFI_DESCRIPTOR("android.net.wifi.IWifiManager"); class ScanResult { private: ScanResult& operator=(const ScanResult& o); public: ScanResult(const ScanResult& o): mSsid(o.mSsid),mBssid(o.mBssid),mCaps(o.mCaps),mLevel(o.mLevel),mFrequency(o.mFrequency),mTimestamp(o.mTimestamp) { } ScanResult(String8 ssid,String16 bssid,String16 caps,int level,int freq,int64_t timeStamp): mSsid(ssid),mBssid(bssid),mCaps(caps),mLevel(level),mFrequency(freq),mTimestamp(timeStamp) { } void dump() { char temp[130]; int size; memset(temp,0,sizeof(temp)); printf("ssid %s \n",mSsid.string()); size = mBssid.size(); if(size > sizeof(temp)/2 - 1) { size = sizeof(temp)/2 - 1; } utf16_to_utf8(mBssid.string(), size, temp); printf("Bssid %s \n",temp); size = mCaps.size(); if(size > sizeof(temp)/2 - 1) { size = sizeof(temp)/2 - 1; } utf16_to_utf8(mCaps.string(), size, temp); printf("ssid %s \n",temp); printf("level %d \n",mLevel); printf("freq %d \n",mFrequency); printf("freq %ld \n",mTimestamp); } private: String8 mSsid; String16 mBssid; String16 mCaps; int mLevel; int mFrequency; int64_t mTimestamp; }; class IWifiService: public android::IInterface { public: DECLARE_META_INTERFACE(WifiService) virtual void startScan(int forceActive) = 0; virtual int getScanResults(List
&list) = 0; virtual bool setWifiEnabled(bool enable) = 0; }; class BpWifiService: public android::BpInterface
{ enum { FIRST_CALL_TRANSACTION = 1, TRANSACTION_getConfiguredNetworks = (android::IBinder::FIRST_CALL_TRANSACTION + 0), TRANSACTION_addOrUpdateNetwork = (android::IBinder::FIRST_CALL_TRANSACTION + 1), TRANSACTION_removeNetwork = (android::IBinder::FIRST_CALL_TRANSACTION + 2), TRANSACTION_enableNetwork = (android::IBinder::FIRST_CALL_TRANSACTION + 3), TRANSACTION_disableNetwork = (android::IBinder::FIRST_CALL_TRANSACTION + 4), TRANSACTION_pingSupplicant = (android::IBinder::FIRST_CALL_TRANSACTION + 5), TRANSACTION_startScan = (android::IBinder::FIRST_CALL_TRANSACTION + 6), TRANSACTION_getScanResults = (android::IBinder::FIRST_CALL_TRANSACTION + 7), TRANSACTION_disconnect = (android::IBinder::FIRST_CALL_TRANSACTION + 8), TRANSACTION_reconnect = (android::IBinder::FIRST_CALL_TRANSACTION + 9), TRANSACTION_reassociate = (android::IBinder::FIRST_CALL_TRANSACTION + 10), TRANSACTION_getConnectionInfo = (android::IBinder::FIRST_CALL_TRANSACTION + 11), TRANSACTION_setWifiEnabled = (android::IBinder::FIRST_CALL_TRANSACTION + 12), TRANSACTION_getWifiEnabledState = (android::IBinder::FIRST_CALL_TRANSACTION + 13), TRANSACTION_setCountryCode = (android::IBinder::FIRST_CALL_TRANSACTION + 14), TRANSACTION_setFrequencyBand = (android::IBinder::FIRST_CALL_TRANSACTION + 15), TRANSACTION_getFrequencyBand = (android::IBinder::FIRST_CALL_TRANSACTION + 16), TRANSACTION_isDualBandSupported = (android::IBinder::FIRST_CALL_TRANSACTION + 17), TRANSACTION_saveConfiguration = (android::IBinder::FIRST_CALL_TRANSACTION + 18), TRANSACTION_getDhc