2015-02-26 9 views
10

Ho un codice applicazione video trimmer.NDK Android: Ottenere java.lang.UnsatisfiedLinkError: dlopen non riuscito: impossibile localizzare il simbolo "segnale" a cui fa riferimento "libffmpeg.so"

codice del file

sua Android.mk è menzionato qui di seguito:

MY_LOCAL_PATH := $(call my-dir) 

includono $ (makefiles tutto-subdir-)

LOCAL_PATH :=$(MY_LOCAL_PATH) 
include $(CLEAR_VARS) 
LOCAL_MODULE := video-trimmer 
LOCAL_SRC_FILES := video-trimmer.c 
LOCAL_C_INCLUDES := $(MY_LOCAL_PATH) $(MY_LOCAL_PATH)/ffmpeg 
LOCAL_SHARED_LIBRARIES := ffmpeg 
LOCAL_LDLIBS += -lz -llog 
include $(BUILD_SHARED_LIBRARY) 

e codice del file Application.mk è:

APP_MODULES  := ffmpeg video-trimmer 
APP_OPTIM := debug 

Quando provo a eseguire questa applicazione, ottengo il seguente errore:

02-26 16:06:05.779: E/AndroidRuntime(4092): FATAL EXCEPTION: main 
02-26 16:06:05.779: E/AndroidRuntime(4092): Process: net.video.trimmer, PID: 4092 
02-26 16:06:05.779: E/AndroidRuntime(4092): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "signal" referenced by "libffmpeg.so"... 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at java.lang.Runtime.loadLibrary(Runtime.java:364) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at java.lang.System.loadLibrary(System.java:526) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at net.video.trimmer.service.VideoTrimmingService.onCreate(VideoTrimmingService.java:29) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at android.app.ActivityThread.handleCreateService(ActivityThread.java:2585) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at android.app.ActivityThread.access$1800(ActivityThread.java:139) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at android.os.Handler.dispatchMessage(Handler.java:102) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at android.os.Looper.loop(Looper.java:136) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at android.app.ActivityThread.main(ActivityThread.java:5086) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at java.lang.reflect.Method.invoke(Method.java:515) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
02-26 16:06:05.779: E/AndroidRuntime(4092):  at dalvik.system.NativeStart.main(Native Method) 

My video-trimmer.so e ffmpeg.so sono generati in \libs\armeabi.

Grazie in anticipo.

+0

questo collegamento potrebbe aiutarti: - http://stackoverflow.com/questions/18111739/why-do-some-android-phones-cause-our-app-to-throw-an-java-lang-unsatisfiedlinker –

+0

@japanjotsingh Grazie. Apprezzo la tua risposta rapida –

+0

puoi provare a impostare 'APP_PLATFORM: = android-15' all'interno del tuo * Application.mk *? – ph0b

risposta

14

signal era una funzione inline fino alla piattaforma Android-21, ora non è più in linea.

Quando si utilizza il ndk r10, Android-21 viene utilizzato per impostazione predefinita, ma non è completamente retro-compatibile con i dispositivi che eseguono versioni precedenti di Android. Nel tuo caso, il segnale non può essere trovato sul tuo dispositivo (ma funzionerebbe correttamente su Lollipop).

Quando si utilizza NDK, è necessario utilizzare la piattaforma (APP_PLATFORM:=android-XX) corrispondente al numero android:minSdkVersion.

Così qui è possibile impostare APP_PLATFORM:=android-15 all'interno Application.mk Makefile, e la vostra lib utilizzerà la versione in linea di segnale, in modo da non cercare il suo simbolo in fase di esecuzione.

+0

Attualmente sto provando a creare un'applicazione per filigrana. Ho usato il comando dal sito ffmpeg.org.Ma quando provo ad eseguire, ottengo un errore in logcat: opzione non riconosciuta filter_complex. La mia domanda StackOverflow è: http://stackoverflow.com/questions/28763388/andoid-ndk-ffmpeg-unrecognised-option-filter-complex –

+0

La compilazione di Android Studio non richiede Android.mk, utilizza Android.ndk gradle. Come posso impostare "APP_PLATFORM"? – Hugo

+0

Non c'è ancora un modo pulito per farlo. È possibile modificare compileSdkVersion per modificare la versione APP_PLATFORM. Ho segnalato questo problema qui: https://code.google.com/p/android/issues/detail?id=177530 – ph0b