Settings模块通过JNI接口调用获取NV中的WiFi/BT MAC地址
高通 WiFi only版本 无法通过调用android原生接口获取WiFi 和BT MAC地址,产线测试需求需要读取NV中写入的WiFi 和BT MAC地址,通过调用高通原生代码nv.h中的方法获取nv中写入的值。
编写源文件
方法命名为Java_调用该方法的类所在包名(如:com_android_settings_wifi)_类名_此方法名(如:getWifiMAC)
如果参数env和thiz没有使用,可以后面加__unused,不然编译报错:
extern "C" JNIEXPORT jstring JNICALL Java_com_android_settings_wifi_WifiInfoPreferenceController_getWifiMAC(JNIEnv *env, jclass thiz __unused) {
int ret = 0;
const char *mac = "UNKNOWN";
unsigned char nv_mac[18] = {0};
unsigned char nv_read[128] = {0};
XLOGI("%s Starting...", __FUNCTION__);
ret = nvctrl_read((nv_items_enum_type)4678, nv_read, sizeof(nv_read));
if (SUCCESS == ret) {
memset(nv_mac, 0, sizeof(nv_mac));
sprintf((char *)nv_mac, "%02X:%02X:%02X:%02X:%02X:%02X", nv_read[0], nv_read[1], nv_read[2], nv_read[3], nv_read[4], nv_read[5]);
XLOGI("NV WiFi MAC: %s.\n", nv_mac);
if (strlen((const char *)nv_mac) == 17) {
mac = (const char *)nv_mac;
}
}
return env->NewStringUTF(mac);
Android.mk文件
# 当前文件的路径
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libSetting_wifi_bt
LOCAL_SRC_FILES := Setting_wifi_bt.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../vendor/qcom/proprietary/commonsys-intf/diag/include/ \
$(LOCAL_PATH)/../../../../vendor/qcom/proprietary/commonsys/fastmmi/libmmi/ \
$(TARGET_OUT_HEADERS)/common/inc
//当前模块所包含的标签,一个模块可以包含多个标签。标签的值可能是eng、user、debug、development、optional。其中,optional是默认标签。
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS := -Wall
//静态库
LOCAL_STATIC_LIBRARIES :=libcutils
//动态库:注释掉是因为编译的时候没找到就报错了
#LOCAL_SHARED_LIBRARIES := \
# libdl \
# libmmi \
# libdiag_system \
# liblog
LOCAL_LDLIBS := -ldl -llog -lmmi -ldiag_system
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
//编译生成共享库,并打包成.so文件
include $(BUILD_SHARED_LIBRARY)
调用
/* return: WiFi MAC string */
+ public native String getWifiMAC();
+
+ /* return: (>= 0: SUCCESS; < 0: FAILED) */
+ public native int nvctrlInit();
+
+ /* return: (>= 0: SUCCESS; < 0: FAILED) */
+ public native int nvctrlDeinit();
+
+ static {
+ System.loadLibrary("Setting_wifi_bt");
final String macAddressnv = getNvWifiMAC();
验证
一般硬件测试MMI中获取MAC地址是通过读NV的方式,
首先通过QXDM工具写入MAC地址值
进入硬件测试MMI工具查看写入的值
进入WiFi——关于手机或者Settings—wifi----wifi preference查看时候获取到写入的nv值
如果是通过单刷Settings apk验证而不是刷版本验证,需要将生成的so文件push到对应的目录下: