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_MainActivit烤恤鹇灭y_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环境指针 和 MainActivityjobject对象传过来,ndk层保存好这两个变量,然后在getWifiIp 函数就可以直接对用这两个变量;
7、到此完毕