您的位置:首页 > 移动开发 > Android开发

Android: 用jni 获取MAC地址

2012-11-18 00:29 435 查看
首先来看看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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: