Well done Angad!!
Forwarding your posts to everybody!
Begin forwarded message:
> From: Angad <[email protected]>
> Date: May 20, 2011 4:38:18 PM GMT-03:00
> To: [email protected]
> Subject: [The UMIT project] libpcap for Android
>
>
> The Android project includes libpcap as an external library as can be seen
> from the source here on kernel.org and Github
>
> My project for Google Summer of Code - The mobile network scanner requires
> the use of libpcap or tcpdump. I was successful in compiling libpcap from its
> source and loading the library to use the native functions in JNI. But since
> an Android application does not run with Root privileges, it is a challenge
> to get the native functions to work in the same process.
>
> The native code and the Java code for an android application runs in the same
> process. So the native code does not have root privileges. So as of now, it
> is not possible to get libpcap functions to work using the NDK. But there are
> alternatives which I will be suggesting in this blog post.
>
> First of all, here are the instructions to successfully compile the
> libpcap.so library for use in the JNI code.
>
> Create a folder called jni in the application root.
>
> Android.mk
>
> LOCAL_PATH := ./jni
>
> include $(CLEAR_VARS)
> LOCAL_MODULE := pcaptest
> LOCAL_SRC_FILES := libpcap-native.c
>
> LOCAL_C_INCLUDES := $(NDK_ROOT)/external/libpcap
>
> LOCAL_STATIC_LIBRARIES := libpcap
>
> LOCAL_LDLIBS := -ldl -llog
>
> include $(BUILD_SHARED_LIBRARY)
>
> include $(NDK_ROOT)/external/libpcap/Android.mk
>
> Libpcap for android is built as a static library and its functions are then
> used as a shared library.
> A shared library build specifications are defined in the Android.mk make file
> in the JNI folder of the project. The JNI folder contains the make files for
> the library. It also contains the native C code with function definitions
> according to the Java package.
>
>
> This is a sample JNI code for getting the list of available network
> interfaces by using the pcap_lookupdevs function
>
> #include <jni.h>
> #include <string.h>
> #include <android/log.h>
> #include <pcap.h>
>
> #define DEBUG_TAG "Sample_LIBPCAP_DEBUGGING"
>
> void Java_org_umit_android_libpcaptest_libpcaptest_testLog(JNIEnv *env,
> jclass clazz, jstring message)
> {
> char errbuf[1024];
> errbuf[0] = '\0';
>
> char *szLogThis;
> char *dev = pcap_lookupdev(errbuf);
>
> if (dev == NULL) {
> szLogThis = "Couldn't find default device";
> }
> else szLogThis = dev;
>
> __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Device status: [%s]",
> szLogThis);
> __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "errbuf [%s]", errbuf);
>
>
> (*env)->ReleaseStringUTFChars(env, message, szLogThis);
> }
> The C code can now be called as native functions from inside Java code by
> loading the shared library
>
> static{
> System.loadLibrary("pcaptest");
> }
>
> private native void testLog(String logThis);
>
>
>
> The native code needs to compiled with ndk-build command and requires the
> android-ndk to be downloaded from the official website.
>
> For now, I am getting the error
>
> D/Sample_LIBPCAP_DEBUGGING( 364): Device status: [Couldn't open device]
> D/Sample_LIBPCAP_DEBUGGING( 364): errbuf [socket: Operation not permitted]
>
>
> And when I try and use the pcap_open_live function, I get the following error
> D/Sample_LIBPCAP_DEBUGGING( 310): errbuf [socket: Operation not permitted]
>
> The reason for this error is that the native code and the application both
> lie in the same process. Invoking a "su" here would not work because an "su"
> just forks a new process that has root privileges but that process would not
> contain our native code.
>
> So a work around for this is that a binary or a unix library should be
> compiled before hand and then supplied with the apk. The binary can be
> extracted from the apk. The binary may require root privileges but it would
> be as easy as forking another process with "su" command.
>
> Here is a blog post explaining that
> http://nerdposts.blogspot.com/2010/11/android-superuser-shared-jni-libs.html
>
> For now, I am just sticking to tcpdump for the requirements of this project.
> If we need a specific implementation of packet sniffing from libpcap, the
> plan is to compile a binary or a unix shared library and supply it with the
> apk.
>
>
> --
> Posted By Angad to The UMIT project at 5/20/2011 04:38:00 PM
---
Adriano Monteiro Marques
http://www.thoughtspad.com
http://www.umitproject.org
http://blog.umitproject.org
http://www.pythonbenelux.org
"Don't stay in bed, unless you can make money in bed." - George Burns
------------------------------------------------------------------------------
What Every C/C++ and Fortran developer Should Know!
Read this article and learn how Intel has extended the reach of its
next-generation tools to help Windows* and Linux* C/C++ and Fortran
developers boost performance applications - including clusters.
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Umit-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/umit-devel