gpt4 book ai didi

c++ - 安卓 NDK + LibEvents

转载 作者:行者123 更新时间:2023-11-30 05:38:00 27 4
gpt4 key购买 nike

我正在尝试开发一个使用 LibEvents 的 android native 胶水应用程序。
我从这里获得了一个 android 友好的 LibEvents 版本...... https://github.com/ventureresearch/libevent

我的 android.mk 文件几乎相同(除了相对路径)。

它成功编译为静态 库并链接到我自己的共享 库。但是,当我尝试执行时,我收到 Dalvik 的错误消息,指示它无法加载我的共享库。

E/AndroidRuntime(16123): Process: com.marty.socketclient1, PID: 16123
E/AndroidRuntime(16123): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.marty.socketclient1/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.marty.socketclient1-1/libSocketClient1.so

如果我不使用我的 LibEvents 构建,我的 native 代码可以正常运行。另请注意,如果我从 LibEvents 中删除所有现有源文件并添加一个具有我自己的函数的新模块,只需在我的共享库中调用它,那么一切都会正常运行。
这使我相信它正在正确构建(或者至少编译/链接标志本身不会禁止加载)。

ndk-depends 报告没有额外的共享对象依赖项,因此我认为可能在执行 dlopen 时在 LibEvents 中执行了一些错误代码。
我尝试用 android 日志记录替换 LibEvents 日志记录机制,但我没有得到进一步的输出。

我也找不到任何出现的

__attribute__((__constructor__))

_init 

在 LibEvents 源代码中。

请注意,LibEvents 只是“C”库,因此不能像 C++ 那样静态初始化对象(或者我的这个假设不正确?)。

还有其他我不知道的在加载时执行功能的方法吗?
我接下来可以检查什么?
我是否可以启用任何进一步的日志记录选项来提供进一步的洞察力?

我还将 android.mk 文件(如下所示)提取到最低限度,以便我可以调用:

evutil_make_socket_nonblocking()

并且仍然遇到无法加载库的问题。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := libevents
LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := \
../evutil.c \
../event.c \
../log.c \
../evthread.c \
../evmap.c \
../signal.c \
../epoll.c \
../poll.c \
../evutil_rand.c \
../select.c

LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/../android \
$(LOCAL_PATH)/../include
LOCAL_CFLAGS := -DHAVE_CONFIG_H -DANDROID -fvisibility=hidden
#LOCAL_CFLAGS := -DHAVE_CONFIG_H -DANDROID -DNDEBUG -fvisibility=hidden

include $(BUILD_STATIC_LIBRARY)

最佳答案

如果其他人遇到此问题,这里是解决方案。

这是一个漫长的过程,但我将函数和隔离模块 stub ,直到我可以只用一个源文件重现问题。然后我注释掉代码,直到我发现导致我的库无法加载的错误调用。

原来是这样的……

long _evutil_weakrand(void)
{
return random();
}

事实上,如果我创建了任何调用 random() 的函数,那么我的共享对象将无法加载。

显然这与android级别有关。您需要使用 19 级,我使用的是 21 级。

关于这个... Android NDK: load_library: cannot locate srand

关于c++ - 安卓 NDK + LibEvents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32983468/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com