Android NDK 中头文件的未定义符号错误

Undefined Symbol Error for a Header File in Android NDK

我在 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 文件移动到我已有的包含文件后,我仍然发现同样的错误。

所以我很确定我已经解决了这个问题,如果其他人碰巧遇到这个问题的话。由于某种原因,这个文件根本不存在。幸运的是,这是一条替代路线(如果存在,请改为调用它)。但是,NDK不理解是否包含(但编译器理解,因此没有放入库)。

所以它搜索了 grp.h,即使它没有被包含在内。所以,它崩溃了。删除它,它修复了错误。

然而,对于任何其他冒险走这条路的人来说,我们开始遇到版本号问题(它崩溃是因为它试图找到 'foo.so.#')。如果您在 makefile 中使版本无效并重新编译,这也应该可以解决此问题。在 NDK 或 Android 的未来版本中,可能会修复版本号,但在撰写本文时还没有。因此,摆脱版本号是您现在的最佳途径。