ndk获取wifi的ip的方法,分两种,一种是通过java层获取,一种是通过linux api获取,用 linux api gethostname获取的名字是"localhost", 调用 gethostbyname 后返回的永远是"127.0.0.1",所以暂时不采用这种方式;
采用Java层获取,jni回调,最大的缺点是麻烦,现将实现过程如下:
方便他人亦是方便自己,如果觉得还行就点下赞吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!
视频和代码的百度云地址:http://pan.baidu.com/s/1pJNT2Dt
工具/原料
- Eclipse
- ADT adt-bundle-windows-x86_64-20140321
- NDK android-ndk-r9d
方法/步骤
- 1
在java层 MainActivity 类中实获取wifi的密码的函数:
int getWifiAddress()
{
WifiManager mgr = (WifiManager)getSystemService(WIFI_SERVICE);
WifiInfo info = mgr.getConnectionInfo();
if (null == info)
return0;
int nIp = info.getIpAddress();
returnnIp;
}
- 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,第三个参数填写该函数的函数签名
jmethodIDmethod= pJniEnv->GetMethodID(clsActivity, "getWifiAddress", "()I");
/// 调用java层函数
int nIp = pJniEnv->CallIntMethod(objActivity, method);
/// 获取ip地址,ip地址就存在于变量ip中
char*ip = inet_ntoa(*((in_addr*)&nIp));
return0;
}
- 6
如果希望直接把 获取wifi ip的功能写成ndk接口 getWifiIp(char* szIp);可以考虑在在 MainActivity的OnCreate中把 JNIEnv环境指针 和 MainActivity jobject对象传过来,ndk层保存好这两个变量,然后在 getWifiIp 函数就可以直接对用这两个变量;
- 7
到此完毕
END
注意事项
- 实现 Java_fk_localtalkie_MainActivity_Tst的时候,如果是C++需要加前缀 extern "C"
- javap -s 指向的是 .class 文件,不是java文件,而.class在Eclipse的资源管理器中是看不见的,需要在windows文件系统中查看