前提条件:
必须驱动和wpa_supplicant都必须支持p2p命令。
部分驱动本身支持p2p,但是可能不完善,p2p命令被屏蔽掉了,这时候需修改wpa_supplicant中读取驱动capa标志位,欺骗wpa_supplicant实现p2p的支持。
Android的修改:
1,增加自定义api
cp WifiNative.java WifiP2p.java
音调hide注释
修改WifiNative--->WifiP2p
注释掉蓝牙相关函数。
cp android_net_wifi_Wifi.cpp android_net_wifi_WifiP2p.cpp
#define WIFI_PKG_NAME "android/net/wifi/WifiP2p"
int register_android_net_wifi_P2p(JNIEnv* env)
修改文件:
frameworks/base/core/jni/AndroidRuntime.cpp
REG_JNI(register_android_net_wifi_WifiP2p),
extern int register_android_net_wifi_WifiP2p(JNIEnv* env);
frameworks/base/core/jni/Android.mk
android_net_wifi_WifiP2p.cpp \
重启。。
NIHelp ( 2569): RegisterNatives failed for 'android/net/wifi/WifiP2p'
E/AndroidRuntime( 2569): Unable to register all android natives
I/ServiceManager( 1119): service 'media.audio_flinger' died
I/ServiceManager( 1119): service 'media.player' died
I/ServiceManager( 1119): service 'media.camera' died
I/ServiceManager( 1119): service 'media.audio_policy' died
I/Netd ( 2571): Netd 1.0 starting
I/ ( 2570): ServiceManager: 0xad50
E/AudioHardwareALSA( 2570): ALSALib: external/alsa-lib/src/control/control.c:902:(snd_ctl_open_noupdatt
W/AudioHardwareALSA( 2570): Unable to attach mixer to device AndroidOut: No such file or directory
E/AudioHardwareALSA( 2570): ALSALib: external/alsa-lib/src/control/control.c:902:(snd_ctl_open_noupdatn
W/AudioHardwareALSA( 2570): Unable to attach mixer to device AndroidIn: No such file or directory
I/CameraService( 2570): CameraService started (pid=2570)
D/AudioHardwareALSA( 2570): openOutputStream called for devices: 0x00000002
D/ALSAModule( 2570): open called for devices 00000002 in mode 0...
I/ALSAModule( 2570): Initialized ALSA PLAYBACK device AndroidPlayback_Speaker_normal
I/AudioFlinger( 2570): AudioFlinger's thread 0x2ee78 ready to run
D/ALSAModule( 2570): route called for devices 00000002 in mode 0...
原因:是蓝牙的几个函数原因。在这几个改动文件删除掉即可。
2,加入:传入命令功能:
文件: frameworks/base/wifi/java/android/net/wifi/WifiP2p.javapublic native static String sendP2pCommand(String p2pCommand);
文件:frameworks/base/core/jni/android_net_wifi_WifiP2p.cpp
//*************************leo for p2p commands*******************************
static jstring android_net_wifi_sendP2pCommand(JNIEnv* env,
jobject clazz,
jstring p2pCommand)
{
char cmdstr[256];
jboolean isCopy;
const char *nameStr = env->GetStringUTFChars(p2pCommand, &isCopy);
if (nameStr == NULL)
return env->NewStringUTF(NULL);
int cmdTooLong = snprintf(cmdstr, sizeof(cmdstr), "%s",nameStr) >= (int)sizeof(cmdstr);
env->ReleaseStringUTFChars(p2pCommand, nameStr);
return cmdTooLong ? env->NewStringUTF(NULL) : doStringCommand(env, cmdstr);
}
//*************************leo for p2p commands*******************************
注册接口::
{ "sendP2pCommand", "(Ljava/lang/String;)Ljava/lang/String;",
(void*) android_net_wifi_sendP2pCommand },
跟新API
make update-api
发现链接失败:
追查原因:链接wpa_supplicant客户端创建两个soket后,attch返回-2失败,
修改客户端soket文件权限:
external/ath_supplicant-0.8.x/src/common/wpa_ctrl.c
//chmod(ctrl->local.sun_path, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
chmod(ctrl->local.sun_path, 0777);
依然:添加wpa_ctrl.c打印信息:
ath_supplicant-0.8.x/wpa_supplicant/Android.mk
LOCAL_SRC_FILES = $(MY_SUPPLICANT)/src/utils/wpa_debug.c $(MY_SUPPLICANT)/src/common/wpa_ctrl.c $(MY_SUPPLICANT)/src/utils/os_$(CONFIG_OS).c