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

先说下的我的开发平台 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。内容如下:

/* 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开发的话其实很简单,有什么问题欢迎交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值