2011-06-08 12 views
7

के साथ एफएफएमपीईजी से लिंक करना मैंने बाम्बसर की फ़ाइलों का उपयोग करके एंड्रॉइड के लिए एफएफएमपीईजी संकलित किया। संकलन ठीक चलाता है। त्रुटियाँ नहीं। मैंने build.sh में पैकेज नाम को बदलना भी सुनिश्चित किया। हालांकि, एक बार जब मैं फ़ाइलों से लिंक करने का प्रयास करता हूं, तो फोन एक असंतुष्ट लिंक्स त्रुटि को फेंकता है।असंतुष्ट LInkError एनडीके

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
MY_LIB_PATH := ffmpeg-android/build/ffmpeg/armeabi/lib 
LOCAL_MODULE := bambuser-libavcore 
LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavcore.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := bambuser-libavformat 
LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavformat.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := bambuser-libavcodec 
LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavcodec.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := bambuser-libavdevice 
LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavdevice.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := bambuser-libavfilter 
LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavfilter.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := bambuser-libavutil 
LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavutil.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := bambuser-libswscale 
LOCAL_SRC_FILES := $(MY_LIB_PATH)/libswscale.so 
include $(PREBUILT_SHARED_LIBRARY) 


#local_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := libtest_jni 
LOCAL_SRC_FILES := libtest/video.c 

LOCAL_C_INCLUDES := \ 
    $(LOCAL_PATH)/include \ 
     $(LOCAL_PATH)/ffmpeg-android/ffmpeg 
     LOCAL_LDLIBS := -L$(NDK_PLATFORMS_ROOT)/$(TARGET_PLATFORM)/arch-arm/usr/lib -L$(LOCAL_PATH) -L$(LOCAL_PATH)/ffmpeg-android/build/ffmpeg/armeabi/lib/ -lavformat -lavcodec -lavdevice -lavfilter -lavutil -lswscale -llog -lz -lm 
     #dl -lgcc 

     include $(BUILD_SHARED_LIBRARY) 

Video.c मृत सरल है:: इस Androkd.mk फ़ाइल है

#include <libavcodec/avcodec.h> 
#include <libavformat/avformat.h> 
#include <libswscale/swscale.h> 

#include <jni.h> 
#include <string.h> 
#include <stdio.h> 
#include <android/log.h> 

void Java_com_bukabros_videolivewallpaper_Opengl2Renderer_loadNthFrame3 
     (JNIEnv * env, jobject this, jstring fileName) { 

     jboolean isCopy; 
     const char * szLogThis = (*env)->GetStringUTFChars(env, fileName, &isCopy); 

      __android_log_print(ANDROID_LOG_DEBUG, "NDK: ", "NDK:LC: [%s]", szLogThis); 
      } 

Tne इसी जावा कोड भी सरल है:

private native void loadNthFrame3(String fileName); 

static { 
System.loadLibrary("libtest_jni"); 
} 

लेकिन मैं इस त्रुटि मिलती है:

E/AndroidRuntime(11489): FATAL EXCEPTION: main 

E/AndroidRuntime(11489): java.lang.ExceptionInInitializerError 

E/AndroidRuntime(11489): at com.bukabros.videolivewallpaper.VideoLiveWallpaper$CubeEngine.<init>(VideoLiveWallpaper.java:147) 

E/AndroidRuntime(11489): at com.bukabros.videolivewallpaper.VideoLiveWallpaper.onCreateEngine(VideoLiveWallpaper.java:120) 

E/AndroidRuntime(11489): at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:814) 

E/AndroidRuntime(11489): at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61) 

E/AndroidRuntime(11489): at android.os.Handler.dispatchMessage(Handler.java:99) 

E/AndroidRuntime(11489): at android.os.Looper.loop(Looper.java:123) 

E/AndroidRuntime(11489): at android.app.ActivityThread.main(ActivityThread.java:4627) 

E/AndroidRuntime(11489): at java.lang.reflect.Method.invokeNative(Native Method) 

E/AndroidRuntime(11489): at java.lang.reflect.Method.invoke(Method.java:521) 

E/AndroidRuntime(11489): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 

E/AndroidRuntime(11489): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 

E/AndroidRuntime(11489): at dalvik.system.NativeStart.main(Native Method) 

E/AndroidRuntime(11489): Caused by: java.lang.UnsatisfiedLinkError: Library libtest_jni not found 

E/AndroidRuntime(11489): at java.lang.Runtime.loadLibrary(Runtime.java:461) 

E/AndroidRuntime(11489): at java.lang.System.loadLibrary(System.java:557) 

E/AndroidRuntime(11489): at com.bukabros.videolivewallpaper.Opengl2Renderer.<clinit>(Opengl2Renderer.java:389) 

E/AndroidRuntime(11489): ... 12 more 

मैंने मैन्युअल रूप से लोड करने की कोशिश की जी जावा में prebuilt साझा पुस्तकालयों (bambuser फ़ाइलें) (System.loadLibrary का उपयोग कर) लेकिन फिर यह मुझे बताता है कि फाइलें नहीं मिली हैं। ओह, हाँ

0x00000001 (NEEDED)      Shared library: [libc.so] 
    0x00000001 (NEEDED)      Shared library: [libstdc++.so] 
    0x00000001 (NEEDED)      Shared library: [libm.so] 
    0x00000001 (NEEDED)      Shared library: [/data/data/com.bukabros.videolivewallpaper/lib/libavformat.so] 
    0x00000001 (NEEDED)      Shared library: [/data/data/com.bukabros.videolivewallpaper/lib/libavcodec.so] 
     0x00000001 (NEEDED)      Shared library: [/data/data/com.bukabros.videolivewallpaper/lib/libavdevice.so] 
     0x00000001 (NEEDED)      Shared library: [/data/data/com.bukabros.videolivewallpaper/lib/libavfilter.so] 
     0x00000001 (NEEDED)      Shared library: [/data/data/com.bukabros.videolivewallpaper/lib/libavutil.so] 
    0x00000001 (NEEDED)      Shared library: [/data/data/com.bukabros.videolivewallpaper/lib/libswscale.so] 
     0x00000001 (NEEDED)      Shared library: [liblog.so] 
     0x00000001 (NEEDED)      Shared library: [libz.so] 
     0x00000001 (NEEDED)      Shared library: [libdl.so] 
     0x0000000e (SONAME)      Library soname: [libtest_jni.so] 
      0x00000010 (SYMBOLIC)     0x0 
      0x00000004 (HASH)      0xd4 
      0x00000005 (STRTAB)      0x250 
     0x00000006 (SYMTAB)      0x130 
      0x0000000a (STRSZ)      712 (bytes) 
      0x0000000b (SYMENT)      16 (bytes) 
      0x00000003 (PLTGOT)      0x174c 
      0x00000002 (PLTRELSZ)     32 (bytes) 
       0x00000014 (PLTREL)      REL 
       0x00000017 (JMPREL)      0x55c 
       0x6ffffffe (VERNEED)     0x53c 
      0x6fffffff (VERNEEDNUM)     1 
       0x6ffffff0 (VERSYM)      0x518 
       0x00000000 (NULL)      0x0 

:

यदि यह मदद करता है, यहाँ readelf के उत्पादन में है। मैं एनएनडीके आर 5 का उपयोग कर रहा हूँ।

+2

THX: कहानी का नैतिक है कि आप हमेशा डॉक्स पढ़ना चाहिए और नहीं देते है :-) यहाँ सही कोड है! – shem

उत्तर

13

ऐसा लगता है कि मुझे जवाब मिल गया। समस्या यह है कि जब आप जावा (System.loadLibrary) में लाइब्रेरी लोड करते हैं, तो आप "lib" उपसर्ग का उपयोग नहीं कर सकते हैं। मुझे जावा में ffmpeg लाइब्रेरी मैन्युअल रूप से लोड करना पड़ा। यह बहुत उपयोगी था अपने Androkd.mk पोस्ट करने के लिए

static { 
System.loadLibrary("avcore"); 
System.loadLibrary("avformat"); 
System.loadLibrary("avcodec"); 
System.loadLibrary("avdevice"); 
System.loadLibrary("avfilter"); 
System.loadLibrary("avutil"); 
System.loadLibrary("swscale"); 
System.loadLibrary("test_jni"); 
} 
+0

बहुत उपयोगी! सिस्टम.लोड लाइब्रेरी ("test_jni") के लिए अन्य को सूचित करने की आवश्यकता है; आपको अपना अंतिम स्थानीय_मॉड्यूल देखने की आवश्यकता है जिसका नाम आपने इसे वीडियो.c पर सेट किया है उदाहरण के लिए इस LOCAL_MODULE: = libtest_jni LOCAL_SRC_FILES: = libtest/video.c *** यदि आप इसे इस LOCAL_MODULE की तरह सेट करते हैं: = वीडियो LOCAL_SRC_FILES: = libtest/video.c तो आपको System.loadLibrary ("वीडियो") का उपयोग करने की आवश्यकता है; –

संबंधित मुद्दे