我正在嘗試開發一個使用LibEvents的android原生粘貼應用程序。
我獲得LibEvents的機器人友好構建從這裏開始...... https://github.com/ventureresearch/libeventAndroid NDK + LibEvents
我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的構建。 另外請注意,如果我從LibEvents中刪除所有現有的源文件,並添加一個新的模塊與我自己的功能和只是調用,在我的共享庫,然後一切行爲。
這使我相信它正在正確構建(或至少編譯/鏈接標誌本身並不禁止加載)。
ndk-depends報告沒有額外的共享對象依賴關係,所以我認爲在dlopen執行時可能會在LibEvents中執行一些錯誤的代碼。
我試圖用android日誌記錄替換LibEvents日誌記錄機制,但我沒有得到更多輸出。
無論是我能找到的LibEvents源代碼
__attribute__((__constructor__))
或
_init
任何事件。
請注意,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)