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此时会生成x86的so动态库。
二 、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开发的话其实很简单,有什么问题欢迎交流。
- Android系统下检测网卡与网线连通状态
- linux下检测网卡与网线连通状态
- Linux下检测网卡与网线连通状态
- Linux下检测网卡与网线连通状态
- Linux下检测网卡与网线连通状态
- Linux下检测网卡与网线连通状态
- linux下检测网卡与网线连通状态
- Linux下检测网卡与网线连通状态
- linux下检测网卡与网线连通状态
- linux下检测网卡与网线连通状态
- linux下检测网卡与网线连通状态
- Linux下检测网卡与网线连接状态
- Linux下检测网卡与网线连接状态
- Linux下检测网卡与网线的连接状态
- Linux下检测网卡与网线的连接状态
- Linux下检测网卡与网线的连接状态
- Linux 检测网卡与网线连接状态
- Linux下检测网卡与网线连接状态,使用ioctl向socket发送SIOCETHTOOL命令字
- 取消隐藏ios键盘的方法
- Windows7在Notepad++中配置Python+OpenCV
- [LeetCode]Convert Sorted List to Binary Search Tree
- c# asp.net常见问题收集之二
- CSS布局之文档流、块级元素与内联元素
- Android系统下检测网卡与网线连通状态
- C++学习随笔之(三)类和对象
- IOCP
- Qt for Embedded Linux data directory is not owned by user xxxxh
- Java基本概念:集合类 List/Set/Map... 的区别和联系
- SQL-server游标的使用
- ASP.net中读取excel内容,并显示在界面上
- 如何注释javascript-jsDoc
- 登陆dedemcs后台空白