Android: 用jni 擷取MAC地址

來源:互聯網
上載者:User

最近有個需求,需要在jni層擷取android裝置的mac地址,google了一圈,沒看到現成的實現方法,所以就只好自己寫一個了。

基本思路是,通過jni調用android java層的api,擷取wifi的mac地址。理論上,所有的java代碼都可以翻譯成jni代碼,所以應該可以實現。

 

首先來看看mac地址擷取的java實現代碼:

public String getLocalMacAddress(Context context) {
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
return info.getMacAddress();
}
 

代碼相當簡單。 就兩個對象:WifiManager 和 WifiInfo對象,所以這個翻譯成jni代碼也不會有多複雜。

先在jni擷取WifiManager 對象:

/*
* 擷取WifiManager 對象
* 參數: jCtxObj 為Context對象
*/
jobject getWifiManagerObj(JNIEnv *env, jclass clz, jobject jCtxObj)
{
LOGI("gotWifiMangerObj ");
//擷取 Context.WIFI_SERVICE 的值
//jstring jstr_wifi_serveice = env->NewStringUTF("wifi");
jclass jCtxClz= env->FindClass("android/content/Context");
jfieldID fid_wifi_service = env->GetStaticFieldID(jCtxClz,"WIFI_SERVICE","Ljava/lang/String;");
jstring jstr_wifi_serveice = (jstring)env->GetStaticObjectField(jCtxClz,fid_wifi_service);

jclass jclz = env->GetObjectClass(jCtxObj);
jmethodID mid_getSystemService = env->GetMethodID(jclz,"getSystemService","(Ljava/lang/String;)Ljava/lang/Object;");
jobject wifiManager = env->CallObjectMethod(jCtxObj,mid_getSystemService,jstr_wifi_serveice);

//因為jclass 繼承自 jobject,所以需要釋放;
//jfieldID、jmethodID是記憶體位址,這段記憶體也不是在我們代碼中分配的,不需要我們來釋放。
env->DeleteLocalRef(jCtxClz);
env->DeleteLocalRef(jclz);
env->DeleteLocalRef(jstr_wifi_serveice);

return wifiManager;
}

然後,再擷取WifiInfo對象:

/*
* 擷取WifiInfo 對象
* 參數: wifiMgrObj 為WifiManager對象
*/
jobject getWifiInfoObj(JNIEnv *env, jobject wifiMgrObj)
{
LOGI("getWifiInfoObj ");
if(wifiMgrObj == NULL){
return NULL;
}
jclass jclz = env->GetObjectClass(wifiMgrObj);
jmethodID mid = env->GetMethodID(jclz,"getConnectionInfo","()Landroid/net/wifi/WifiInfo;");
jobject wifiInfo = env->CallObjectMethod(wifiMgrObj,mid);

env->DeleteLocalRef(jclz);
return wifiInfo;
}

 

現在只差最後一步了,調用WifiInfo的getMacAddress()方法:

/*
* 擷取MAC地址
* 參數:wifiInfoObj, WifiInfo的對象
*/
char* getMacAddress(JNIEnv *env, jobject wifiInfoObj)
{
LOGI("getMacAddress.... ");
if(wifiInfoObj == NULL){
return NULL;
}
jclass jclz = env->GetObjectClass(wifiInfoObj);
jmethodID mid = env->GetMethodID(jclz,"getMacAddress","()Ljava/lang/String;");
jstring jstr_mac = (jstring)env->CallObjectMethod(wifiInfoObj,mid);
if(jstr_mac == NULL){
env->DeleteLocalRef(jclz);
return NULL;
}

const char* tmp = env->GetStringUTFChars(jstr_mac, NULL);
char* mac = (char*) malloc(strlen(tmp)+1);
memcpy(mac,tmp,strlen(tmp)+1);
env->ReleaseStringUTFChars(jstr_mac, tmp);
env->DeleteLocalRef(jclz);
return mac;
}

只需要把這三個過程串起來就ok了

jobject wifiManagerObj = getWifiManagerObj(env, clz, jCtxObj);
jobject wifiInfoObj = getWifiInfoObj(env,wifiManagerObj);
char * mac = getMacAddress(env,wifiInfoObj);

 

完整源碼為:

http://download.csdn.net/detail/niosm/4409938

相關文章

聯繫我們

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