2014-01-06 51 views
-2

我有一個問題,的Android NDK鏈接共享庫不滿意的鏈接錯誤

下面是Android.mk

LOCAL_PATH := $(call my-dir) 
INITIAL_PATH := $(LOCAL_PATH) 

include $(CLEAR_VARS) 
LOCAL_MODULE := ffmpegbuilt 
LOCAL_SRC_FILES := libffmpeg.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ 
include $(PREBUILT_SHARED_LIBRARY) 


LOCAL_PATH := $(INITIAL_PATH) 
LOCAL_MODULE := main_module 
LOCAL_ARM_MODE := arm # remove this if you want thumb mode 
LOCAL_SRC_FILES := main.c 
LOCAL_LDLIBS := -llog 
LOCAL_SHARED_LIBRARIES := ffmpegbuilt 
include $(BUILD_SHARED_LIBRARY) 

它創建兩個shared_libraries預期。我看到libs/armeabi文件夾 內這兩個庫當我運行該應用程序時,會出現不滿意的鏈接錯誤作爲

01-06 20:21:38.281: E/AndroidRuntime(435): FATAL EXCEPTION: main 
01-06 20:21:38.281: E/AndroidRuntime(435): java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1962]: 32 could not load needed library 'libffmpeg.so' for 'libmain_module.so' (load_library[1104]: Library 'libffmpeg.so' not found) 
01-06 20:21:38.281: E/AndroidRuntime(435): at java.lang.Runtime.loadLibrary(Runtime.java:434) 
01-06 20:21:38.281: E/AndroidRuntime(435): at java.lang.System.loadLibrary(System.java:554) 

可能是什麼問題,也雖然我定義LOCAL_MODULE := ffmpegbuilt,爲什麼預建庫的模塊名稱沒有改變?

回答

2

讓我們從第二個問題開始。不,預建庫的LOCAL_MODULE的名稱不會更改文件的名稱。這是它的設計。是的,這個名字對建立的靜態和共享庫影響更大。但重建的並不遵循相同的模式。

現在你的第一個問題。 Android不會在本地應用程序的lib目錄中查找動態依賴項。有一些技術原因,甚至有些解決方法。但通常,我們只需在Java中使用本地共享庫,保持正確的順序,以便在每一步都能解決外部依賴關係。

在你的情況,本次討論會分解成

System.loadLibrary("ffmpeg"); 
System.loadLibrary("main_module"); 
+0

謝謝亞歷克斯,對於第二個問題! – nmxprime

+0

我試過你的建議,但仍然是相同的情況! – nmxprime

+1

感謝亞歷克斯,它的工作,實際上加載庫的順序是重要的!我首先嚐試加載main_module然後加載ffmpeg,但正如你所說,應該首先添加依賴!我知道了 – nmxprime