ndk wifi ip 实现 附源码 详解
1、在java层 MainActivity 类中实获取wifi的密码的函数:
int getWifiAddress()
{
WifiManager mgr = (WifiManager)getSystemService(WIFI_SERVICE);
WifiInfo info = mgr.getConnectionInfo();
if (null == info)
return 0;
int nIp = info.getIpAddress();
return nIp;
}
2、将 MainActivity 的对象指针传到ndk层:
在类中声明一个函数,不需要实现,由ndk层来实现:
public native int Tst();
并在 MainActivity 的 onCreate 方法中调用
Tst();
3、通过javah生成对应的c接口,由ndk层来来实现改函数:
在ndk层实现对应的函数 (C++的话需要加 extern "C"前缀)
extern "C" JNIEXPORT jint JNICALL Java_fk_localtalkie_MainActivity_Tst
(JNIEnv *pJniEnv, jobject objActivity);
如下图,javah的通过Eclipse的 菜单下的 Run->External Tools->External Tools Configuration... 配置的效果图:配置好后点击 Run 就会在 jni/platform下面生成对应的文件 fk_localtalkie_MainActivity.h

4、通过javap生成java层 MainActivity 类的方法签名,
如下图,javp的通过Eclipse的 菜单下的 Run->External Tools->External Tools Configuration... 配置的效果图:配置好后点击 Run 就会在 Eclipse 控制台窗口生成对应的 函数签名,如下图


5、在ndk层实现
extern "C"
JNIEXPORT jint JNICALL Java_fk_localtalkie_MainActivity_Tst
(JNIEnv *pJniEnv, jobject objActivity)
{
/// 获取 MainActivity类,不是对象,对象已经有了是:objActivity
jclass clsActivity = pJniEnv->FindClass("fk/localtalkie/MainActivity");
/// 获取类中的函数 getWifiAddress的函数ID,第三个参数填写该函数的函数签名
jmethodID method = pJniEnv->GetMethodID(clsActivity, "getWifiAddress", "()I");
/// 调用java层函数
int nIp = pJniEnv->CallIntMethod(objActivity, method);
/// 获取ip地址,ip地址就存在于变量ip中
char* ip = inet_ntoa(*((in_addr*)&nIp));
return 0;
}
6、如果希望直接把 获取wifi ip的功能写成ndk接口 getWifiIp(char* szIp);可以考虑在在 MainActivity的OnCreate中把 JNIEnv环境指针 和 MainActivity jobject对象传过来,ndk层保存好这两个变量,然后在 getWifiIp 函数就可以直接对用这两个变量;
7、到此完毕