2015-10-07 34 views
1

我正在嘗試開發一個使用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) 

回答

1

如果有其他人遇到這個問題,這裏是解決方案。

這是一個漫長的過程,但我扼殺功能和隔離模塊,直到我可以用一個源文件重現問題。 然後我發表了代碼,直到找到導致我的庫不加載的錯誤調用。

原來是這個...

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

事實上,如果我創建了任何調用random()的函數,那麼我的共享對象無法加載。

顯然這與android級別有關。您需要使用19級,我是用水平21

涉及到這... Android NDK: load_library: cannot locate srand