我在Android Studio项目中使用本机库。我试图利用net-snmp,这是一个C库(不幸的是,这是必须的。我不能使用替代品,因为有一个更大的本机库依赖于此。)。我们已经将这些文件编译成.so文件并且已经正确地完成了这项工作(据我所知,它在任何情况下都可以编译而没有错误。)。
但是,每当尝试加载这些库时,我都会收到以下错误:java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "endgrent" referenced by "libnetsnmp.so"...
此功能来自grp.h
,它包含在每个版本的Android NDK中。这是Android.mk文件的相关部分:
include $(CLEAR_VARS)
LOCAL_MODULE := NetSNMP
LOCAL_SRC_FILES := net-snmp/libnetsnmp.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/net-snmp/include
include $(PREBUILT_SHARED_LIBRARY)
我是NDK的新手,但我发现的所有未定义的符号错误通常都指其无法找到合适的文件夹。据我所知,这应该由Android NDK引入。我在这里做错了吗?这只是与makefile无关的一些错误吗?
更新:即使在尝试将grp.h文件移动到我已经拥有的包含之后,我仍然会发现相同的错误。
答案 0 :(得分:0)
所以我很确定如果有其他人碰巧遇到这个问题,我会想到这一点。由于某种原因,这个文件根本就不存在。幸运的是,这是一种替代路线(如果存在,则称之为替代路线)。但是,NDK不理解是否包含(但编译器没有,因此它没有放入库中)。
所以它搜索了grp.h,即使它没有包括在内。所以,它崩溃了。删除它,它修复了错误。
然而,对于其他任何冒险沿着这条路走下去的人来说,我们开始遇到版本号的问题(它崩溃了,因为它试图找到' foo.so。#')。如果你在makefile中使版本为void并重新编译,这也应该解决这个问题。在NDK或Android的未来版本中,可能存在版本号的修复,但是没有编写此版本。所以摆脱版本号是你现在最好的路线。