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. 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. 2

    将 MainActivity 的对象指针传到ndk层:

    在类中声明一个函数,不需要实现,由ndk层来实现:

    public native int Tst();

    并在 MainActivity 的 onCreate 方法中调用

    Tst();

  3. 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. 4

    通过javap生成java层 MainActivity 类的方法签名,

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

  5. 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. 6

    如果希望直接把 获取wifi ip的功能写成ndk接口 getWifiIp(char* szIp);可以考虑在在 MainActivity的OnCreate中把 JNIEnv环境指针 和 MainActivity jobject对象传过来,ndk层保存好这两个变量,然后在 getWifiIp 函数就可以直接对用这两个变量;

  7. 7

    到此完毕

    END

注意事项

  • 实现 Java_fk_localtalkie_MainActivity_Tst的时候,如果是C++需要加前缀 extern "C"
  • javap -s 指向的是 .class 文件,不是java文件,而.class在Eclipse的资源管理器中是看不见的,需要在windows文件系统中查看
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。