【问题标题】:jNetPcap on Android: problem with findAllDevs method!Android 上的 jNetPcap:findAllDevs 方法有问题!
【发布时间】:2011-05-11 15:18:11
【问题描述】:

我已经成功地将 jNetPcap 编译为 Android 的共享库。我使用以下代码制作了一个简单的应用程序:http://jnetpcap.com/examples/classic 来测试 API。

问题是,当我调用 findAllDevs 方法并引发异常并显示以下消息:“无法读取设备列表,错误 issocket:权限被拒绝”

我无法理解原因,因为我已经在程序的第一部分进行了调用,以便获得我的应用程序的 root 权限,并且我将我的应用程序测试到有 root 权限的手机上。当我运行该应用程序时,会弹出一个带有此消息的弹出窗口:“SnifferApp 已被授予超级用户权限”,然后发生异常。

有什么想法吗?

这是我的一段代码:

Process p = Runtime.getRuntime().exec("su");
/*try {
    Thread.sleep(10000);
} catch (InterruptedException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
} // do nothing for 1000 miliseconds (1 second)
*/
try {
        System.loadLibrary(JNETPCAP_LIBRARY_NAME);
}
catch (UnsatisfiedLinkError e) {
    System.out.println("Native code library failed to load.\n" + e);
}

 /***************************************************************************
 * First get a list of devices on this system
 **************************************************************************/ 
 int r = Pcap.findAllDevs(alldevs, errbuf);
 r = Pcap.findAllDevs(alldevs, errbuf);
 if (r == Pcap.NOT_OK || alldevs.isEmpty()) { 
    tv.append("Can't read list of devices, error is" + errbuf 
    .toString());
    setContentView(tv);
    return; 
 }

【问题讨论】:

  • 嗨,我的应用程序也有同样的问题。我能够安装 jnetpcap,但是在运行“findAllDevs”功能时,我收到一个空列表,errbuf 中没有错误……我想知道你是否解决了这个问题?我已经以 root 身份运行应用程序:$sudo -i -> root#eclipse -> 在 eclipse 中启动 AVD
  • 我根本没有解决它。最后,我使用本地代码来运行我的实验。如果我发现了什么,我会告诉你的。
  • Thanasis Petsas 我也有同样的问题。我已经使用 Android NDK 成功编译了 JnetPcap 库,但是当我从 JnetPcap 官方网站运行这个经典示例时,alldevs.size() 返回 0。你解决了吗???
  • 亲爱的 Ezazel, 我已经有很长时间没有研究它了。据我记得,我还没有找到关于这个的解释或解决方案..

标签: android exception libpcap device sniffer


【解决方案1】:

据我了解,您正在创建一个新进程并获得超级用户权限,但您的应用没有这些权限。

尝试在清单文件中添加此权限:

<uses-permission android:name="android.permission.INTERNET" /> 

我猜 findAllDevs 会打开手机上的网络设备。

【讨论】:

  • 是的,通过这样做,Pcap.NOT_OK 的值为 false :),但由于 alldevs.isEmpty() 为真,代码再次到达 if 块。现在errbuf 不包含任何内容。我尝试在清单文件中添加更多权限:
  • 这是因为您的应用程序没有以 root 身份运行。也许您可以做的是创建两个应用程序。您使用 pcap 的普通应用程序和一个以 root 身份启动普通应用程序的“启动器”。类似“su -c ”的东西。 可以是使用 am start ... 来启动您的应用程序的脚本。这只是一个想法,祝​​你好运。
  • 是的,我尝试过这样做!我第一次输入: $su #am start -a android.intent.action.MAIN -n com.sniffer.jni/com.sniffer.jni.SnifferApp 但应用程序像以前一样使用应用程序特权运行(ps 显示:app_79 9844 55 128016 17812 ffffffff afe0dab4 S com.sniffer.jni)。然后我尝试了这个:# su -c am start -a android.intent.action.MAIN -n com.sniffer.jni/com.sniffer.jni.SnifferApp 我得到了这个: Permission denied :(
  • 我认为 - 不必以 root 权限运行该进程。 Android - 是 Linux(修改)。启动应用程序后,您可以尝试将应用程序的 UID 添加到特定组,该组提供必要的权限(使用 root shell)。我没有机会尝试。
  • 是否真的需要root才能获取网络设备列表?这不是 Android 权限的用途吗?
猜你喜欢
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
相关资源
最近更新 更多