Android系统下检测网卡与网线连通状态

来源:互联网 发布:2020年中国 知乎 编辑:程序博客网 时间:2024/05/21 19:21

           先说下的我的开发平台 PC终端机,不是通常的手机和平板电脑,是彩票终端机,买过彩票的同学肯定懂得。

          在开机和交易的时候必须要检测网络是否正常,在手机和平板上大家都会想到ConnectivityManager类来判断,这样的方法我就不讲了,网上有很多,但是ConnectivityManager只能检测wifi或者Mobile,而我要检测的是可以查网线的eth0,所以ConnectivityManager是肯定不行的。我最后想到了linux系统下检测网卡

与网线连通状态的方法,如果linux下可以,那么我只用给上层应用用JNI写个接口就可以成功检测了。这里又用到了NDK开发,还是一步一步的来吧,先配置NDK吧!

 

一 、配置NDK方法如下:

        1)下载android NDK压缩包。

       2)解压:tar jxvf  android-ndk-r7-linux-x86.tar.bz2;解压后的目录为/home/xxx/android-ndk-r7

       3)配置PATH路径:命令行执行sudo vim /etc/profile,在文件末尾加入如下内容:

                            #set NDK env

                            export  NDK_HOME=/home/xxxx/android-ndk-r7

                            export  PATH=$NDK_HOME:$PATH

       保存后,重启机器,配置完成。

       4)编译sample工程,执行命令cd  /home/xxxx/android-ndk-r7/sample/hello-jni,进入此目录,执行ndk-build,libs/armabi文件中会看到 .so文件。

  5)把编译后生成的libs包和jni包拷贝到eclipse工程中的根目录下,运行工程会生成apk包,把so文件拷贝到x86-android系统下的system/libs目录下,执行安装包命令adb  install   xxxx.apk,  安装好应用程序后执行,会显示应用程序已停止。-----解决办法:在jni的目录下创建Application.mk文件,添加二行代码如下:APP_ABI := armeabi x86   APP_PLATFORM := android-14,再次执行ndk-build,c此时会生成x86so动态库。

二 、NDK如果配置好了,那就开始写接口代码。

这里主要有二个jiva文件JniInterface.java和NetCheckActivity.java

JniInterface.java

package weijing.zhcw;

public class JniInterface {
 public native int CheckNetJni();
}

NetCheckActivity.java

package weijing.zhcw;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class NetCheckActivity extends Activity {
  static {  
      System.loadLibrary("weijing_zhcw_JniInterface");
     }
  JniInterface jniinterface = new JniInterface();
  int state = 0;
  TextView ShowTextView = null;
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.main); 
         ShowTextView = (TextView) findViewById(R.id.netinfo);
         state =  jniinterface.CheckNetJni();
         if(state == 0){
         System.out.println("state-->" + state);
          ShowTextView.setText(String.valueOf(state));
         }
         else
          ShowTextView.setText(String.valueOf(state));
     }   
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="weijing.zhcw"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />

     <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".NetCheckActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

其实最重要的是java怎么才能调用linux C的代码,下面开始介绍。

三 、如果编译生成so库

这个是我的工程目录结构。

1、进入windows命令行,进入到JniInterface.java文件所在的目录下,执行命令javac  JniInterface.java生成class,在回到src目录下执行Javah -jni weijing.zhcw.JniInterface,会在src目录下weijing_zhcw_JniInterface.h的文件,这就是javah给我们生成的C要用的头文件,如果您还不知道NDK开发基本流程,建议先研究下,我这里说的很简单。

2、下面就要开始写linux C 代码了,最简单的办法就是把weijing_zhcw_JniInterface.h变成weijing_zhcw_JniInterface.c。

注意:千万不要把weijing_zhcw_JniInterface.h包含到weijing_zhcw_JniInterface.c中,这样做的话.c文件不会被编译,而且也会生成so库,然后运行的时候报找不到库的错误,这个问题我纠结了四个小时。

内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
 
#include <fcntl.h>  
#include <errno.h>  
#include <sys/ioctl.h>  
 
#include <sys/types.h>  
#include <sys/socket.h>  
#include <linux/if.h>  
#include <linux/sockios.h>  
#include <android/log.h>
#include <sys/types.h>
#include <net/if.h>
#include <getopt.h>


/* Header for class weijing_zhcw_JniInterface */

#ifndef _Included_weijing_zhcw_JniInterface
#define _Included_weijing_zhcw_JniInterface
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     weijing_zhcw_JniInterface
 * Method:    CheckNetJni
 * Signature: ()I
 */

int get_netlink_status(const char *if_name) 

        struct ifreq ifr;
        int skfd = socket(AF_INET, SOCK_DGRAM, 0);

        strcpy(ifr.ifr_name, if_name);
        if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)
        {
                return -1;
        }
        if(ifr.ifr_flags & IFF_RUNNING)
                return 0;  // 网卡已插上网线
 else return -1;

JNIEXPORT jint JNICALL Java_weijing_zhcw_JniInterface_CheckNetJni
  (JNIEnv * env, jobject jobj){
   jint state = 0;
 state =  get_netlink_status("eth0"); 
 return state;
}

#ifdef __cplusplus
}
#endif
#endif

很简短的代码,编译成功后会生成So库,就可以用了。OK完了,如果您会jni开发的话其实很简单,有什么问题欢迎交流。

 

 

 

 

 

原创粉丝点击