2014-09-22 56 views
1

我的Android NDK應用程序中的某個C代碼調用了signal.h中定義的sigemptyset()函數。我正在使用NDK-r9來構建我的項目。sigemptyset()NDK UnsatisfiedLinkError dlopen()

我的庫文件名爲「libnative-service.so」構建的很好,在c代碼編譯後。 但是在運行應用程序時,我得到以下有關引用sigemptyset()的錯誤。

我錯過了什麼?

09-22 15:13:09.102: E/art(3718): dlopen("/data/app-lib/com.project/libnative-service.so", RTLD_LAZY) failed: dlopen failed: cannot locate symbol "sigemptyset" referenced by "libnative-service.so"... 
09-22 15:13:09.103: D/AndroidRuntime(3718): Shutting down VM 
09-22 15:13:09.106: E/AndroidRuntime(3718): FATAL EXCEPTION: main 
09-22 15:13:09.106: E/AndroidRuntime(3718): Process: com.project, PID: 3718 
09-22 15:13:09.106: E/AndroidRuntime(3718): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "sigemptyset" referenced by "libnative-service.so"... 
+1

你是如何編譯/構建你的庫?什麼是編譯器/鏈接器命令行? – 2014-09-22 14:20:11

+0

這個工作適合你嗎?當嘗試運行ndk分析工具時,Im也有類似的問題 – 2014-10-14 15:05:16

回答

2

該功能似乎被宣佈在線:

static __inline__ int sigemptyset(sigset_t *set) 
{ 
    memset(set, 0, sizeof *set); 
    return 0; 
} 

所以它應該已經在編譯的庫解決,而不是由運行時鏈接填寫的依賴。如果沒有解決,看起來你的圖書館沒有正確建立。

你也許鏈接了錯誤的標題?如果你使用了non-ndk signal.h,你可能無法正確編譯這個函數的使用。

+0

似乎沒有編譯器錯誤。我也在我的Android.mk文件中使用這些標誌: LOCAL_LDLIBS + = -ldl -llog -lc -lm – revolutionary 2014-09-22 16:10:19

+0

沒有收到編譯器錯誤*不表示您已經正確編譯了Android目標 - 相反,問題是編譯器不遵循ndk頭文件中的指令,可能是因爲它沒有看那些,而是看到它錯誤地指向的一些*其他*。 – 2014-09-22 16:31:02

+0

我的Android.mk文件在這樣的另一個項目中引用一個文件: include ../tun2socks/Android.mk。 我需要保持我的C文件在一個單獨的項目。如果我將所有C文件包含在同一個項目中,那麼一切正常 – revolutionary 2014-09-23 11:28:02

相關問題