博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android: 用jni 获取MAC地址
阅读量:4043 次
发布时间:2019-05-24

本文共 2700 字,大约阅读时间需要 9 分钟。

首先来看看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://dgrdi.baihongyu.com/

你可能感兴趣的文章
Android2.1消息应用(Messaging)源码学习笔记
查看>>
android raw读取超过1M文件的方法
查看>>
ubuntu下SVN服务器安装配置
查看>>
MPMoviePlayerViewController和MPMoviePlayerController的使用
查看>>
CocoaPods实践之制作篇
查看>>
[Mac]Mac 操作系统 常见技巧
查看>>
苹果Swift编程语言入门教程【中文版】
查看>>
捕鱼忍者(ninja fishing)之游戏指南+游戏攻略+游戏体验
查看>>
iphone开发基础之objective-c学习
查看>>
iphone开发之SDK研究(待续)
查看>>
计算机网络复习要点
查看>>
Variable property attributes or Modifiers in iOS
查看>>
NSNotificationCenter 用法总结
查看>>
C primer plus 基础总结(一)
查看>>
剑指offer算法题分析与整理(三)
查看>>
Ubuntu 13.10使用fcitx输入法
查看>>
pidgin-lwqq 安装
查看>>
mint/ubuntu安装搜狗输入法
查看>>
C++动态申请数组和参数传递问题
查看>>
opencv学习——在MFC中读取和显示图像
查看>>