java.lang.UnsatisfiedLinkError中:执行dlopen失败:无法找到符号QUOT; cmsg_nxthdr"通过引用" libpcap.so" [英] java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "cmsg_nxthdr" referenced by "libpcap.so"

查看:2083
本文介绍了java.lang.UnsatisfiedLinkError中:执行dlopen失败:无法找到符号QUOT; cmsg_nxthdr"通过引用" libpcap.so"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新来NDK。我想创建一个应用程序,可以捕获数据包。我从 https://github.com/the-tcpdump-group/libpcap

I am new to NDK. I am trying to create an app that can capture packets. I have compiled libpcap from https://github.com/the-tcpdump-group/libpcap

现在,当我尝试运行在Android平板电脑的应用程序,它提供了以下错误

Now when I try to run the application on an android tablet, it gives the following error

07-24 02:29:50.627: E/AndroidRuntime(2014): FATAL EXCEPTION: main
07-24 02:29:50.627: E/AndroidRuntime(2014): Process: com.example.lpcap, PID: 2014
07-24 02:29:50.627: E/AndroidRuntime(2014): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "cmsg_nxthdr" referenced by "libpcap.so"...
07-24 02:29:50.627: E/AndroidRuntime(2014):     at java.lang.Runtime.loadLibrary(Runtime.java:364)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at java.lang.System.loadLibrary(System.java:526)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at com.example.lpcap.MainActivity.<clinit>(MainActivity.java:37)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at java.lang.Class.newInstanceImpl(Native Method)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at java.lang.Class.newInstance(Class.java:1208)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2112)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at android.os.Handler.dispatchMessage(Handler.java:102)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at android.os.Looper.loop(Looper.java:136)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at android.app.ActivityThread.main(ActivityThread.java:5017)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at java.lang.reflect.Method.invokeNative(Native Method)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at java.lang.reflect.Method.invoke(Method.java:515)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-24 02:29:50.627: E/AndroidRuntime(2014):     at dalvik.system.NativeStart.main(Native Method)

在socket.h中有NDK这个符号。我不知道这是否是越来越编译。我必须手动添加它,我应该怎么做呢?以下是Android.mk

socket.h in ndk has this symbol. I am not sure if it is getting compiled. I have to manually add it, how should I go about it? Following is the Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

libpcap_PSRC =  pcap-linux.c pcap-usb-linux.c  pcap-can-linux.c pcap-netfilter-linux.c  
libpcap_FSRC =  fad-gifc.c
libpcap_CSRC =  pcap.c inet.c gencode.c optimize.c nametoaddr.c etherent.c \
    savefile.c sf-pcap.c sf-pcap-ng.c pcap-common.c \
    bpf_image.c bpf_dump.c
libpcap_GENSRC = scanner.c grammar.c bpf/net/bpf_filter.c version.c lpcap.c

libpcap_SRC =   $(libpcap_PSRC) $(libpcap_FSRC) $(libpcap_CSRC) $(libpcap_GENSRC)
LOCAL_SRC_FILES:=\
    $(libpcap_SRC)
LOCAL_SHARED_LIBRARIES :=  libc cutils
LOCAL_CFLAGS:=-O2 -g
LOCAL_CFLAGS+= -DSYS_ANDROID=1 -Dyylval=pcap_lval -DHAVE_CONFIG_H -D_U_="__attribute__((unused))" -Dlinux -D__GLIBC__
#-D_GNU_SOURCE
LOCAL_LDLIBS := -ldl -lc 
LOCAL_MODULE:= libpcap
include $(BUILD_SHARED_LIBRARY)

我在Java文件中使用加载此

I am loading this in the java file using

static{  
        System.loadLibrary("pcap");  
    }

我没有叫任何方法。我只是希望它能够加载库没有问题。请帮我解决这个问题。

I haven't called any method. I just want it to be able to load the library without problems. Please help me solve this.

推荐答案

将您的precompiled的libpcap的JNI文件夹。如果您在打靶多种架构,你需要创建对应于每个架构(armeabi,X86等),您的JNI内的多个文件夹,并相应地放置.so文件。修改清单文件如下面,包括您的prebuilt共享库

Move your precompiled libpcap to the JNI folder. If you are targetting multiple architectures you need to create multiple folders within your JNI corresponding to each architecture(armeabi,x86 etc) and place the .so files accordingly. Modify your manifest file like below to include your prebuilt shared library

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := libpcap
LOCAL_SRC_FILES := libpcap.so
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE    := projectname
LOCAL_SRC_FILES := projectname.cpp
include $(BUILD_SHARED_LIBRARY)

的projectname对应的libpcap的模块和projectname.cpp对应于实际的源文件

projectname corresponds to the module of libpcap and projectname.cpp corresponds to the actual source file

这篇关于java.lang.UnsatisfiedLinkError中:执行dlopen失败:无法找到符号QUOT; cmsg_nxthdr&QUOT;通过引用&QUOT; libpcap.so&QUOT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆