2013-03-06 102 views
7

我已經開始開發一個非常簡單的Android應用程序,它由三個部分組成:Dalvik正在尋找帶有'.0'擴展名的.so文件 - 爲什麼?

  • Java應用程序本身
  • 預先建立的共享庫(我們叫它libfoo
  • 另一個共享庫使用預建庫(我們就叫它libfoowrapper

文件系統看起來是這樣的:

jni 
Android.mk 
libfoo.so 
foowrapper.c 

Android.mk文件包含以下內容:

LOCAL_PATH := $(call my-dir) 

#============================== 

include $(CLEAR_VARS) 

LOCAL_MODULE := foo-prebuilt 
LOCAL_SRC_FILES := libfoo.so 

include $(PREBUILT_SHARED_LIBRARY) 

#========================= 

include $(CLEAR_VARS) 

LOCAL_MODULE := foowrapper 
LOCAL_SRC_FILES := foowrapper.c 

LOCAL_SHARED_LIBRARIES := foo-prebuilt 

include $(BUILD_SHARED_LIBRARY) 

當我在Eclipse中構建應用程序,事情似乎做工精細 - 沒有錯誤報告。然而,當我將應用程序上傳到我的三星體驗(運行Android 4.0.4),我得到的日誌中出現以下錯誤:

03-05 21:20:27.859: E/AndroidRuntime(20324): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]: 102 could not load needed library 'libfoo.so.0' for 'libfoowrapper.so' (load_library[1091]: Library 'libfoo.so.0' not found) 

爲什麼在Dalvik尋找.so.0文件,而不是.so文件?我需要對我的應用程序進行哪些更改才能擺脫此錯誤?

+0

能否請您複製如何正在加載Java方面的庫?您需要執行系統。按照正確的順序在Java中的靜態塊中加載loadLibrary(「foo」)和System.loadLibrary(「foowrapper」)。此外,你是否在其他設備上嘗試過? – Esparver 2013-03-06 08:40:29

+0

聽起來像'libfoowrapper.so'有'libfoo.so.0'的引用。檢查libfoowrapper.so正在被鏈接到什麼位置。 – fadden 2013-03-12 17:07:51

回答

4

至少在Linux世界中,每個共享庫都有一個名爲soname的特殊名稱。 soname的前綴爲lib,庫的名稱,短語.so,後跟一個句點和一個版本號,只要接口發生變化就會增加一個版本號(作爲特殊例外,最低級C庫不以lib開頭)。完全合格的soname包含它所在目錄的前綴;在工作系統上,完全合格的soname只是共享庫的一個符號鏈接real name

每個共享庫還有一個real name,它是包含實際庫代碼的文件名。真名爲soname添加了一個時期,一個次要數字,另一個時期以及發行版本號。上一期和版本號是可選的。次要編號和版本號通過讓您確切知道安裝了哪個版本的庫來支持配置控制。請注意,這些數字可能與文檔中用於描述庫的數字不同,儘管這樣做可以讓事情變得更簡單。

參考:Linux Standard Base

編輯: 看來,這不是一個罕見的問題,還沒有看到任何真正的解決方案,但也許這將讓你開始找到的東西,你的作品。

問題與LOCAL_SRC_FILES使用PREBUILT_SHARED_LIBRARY 時https://groups.google.com/forum/#!topic/android-ndk/_UhNpRJlA1k

創建非版本共享庫的Android http://www.opengis.ch/2011/11/23/creating-non-versioned-shared-libraries-for-android/

圖書館libproj.so.0'未找到 https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/ai3tu0XXs88

+0

這實在是我的錯,因爲沒有更好的表述,但我真正的問題是「我該如何解決這個問題?」我的應用程序不會以當前的形式運行。 – 2013-03-06 06:28:20

+0

爲什麼不簡單地重命名它,並試圖看看它是否工作? :) – kaderud 2013-03-06 06:30:27

+0

然後我得到一個錯誤:「Android NDK:錯誤:jni/Android.mk:git2-prebuilt:LOCAL_SRC_FILES指向缺少的文件」。 – 2013-03-06 06:56:41