2012-06-29 45 views
2

我在嘗試在我的原生android項目中加載libpng時出現問題。 看來,編譯器不識別libpng函數,但確實識別類型(如png_byte)。它通常用類型編譯,但如果我添加函數會拋出錯誤。將libpng鏈接到android原生項目

這裏的編譯輸出(Windows 7的CMD):

D:\Dropbox\Workspace\Eclipse\GhostEngine\jni>C:\android-ndk-r8\ndk-build 
"Compile++ thumb : ghost <= ImagePng.cpp 
"Compile++ thumb : ghost <= MainAndroid.cpp 
"Compile++ thumb : ghost <= PlatformAndroid.cpp 
make: Circular D:/Dropbox/Workspace/Eclipse/GhostEngine//obj/local/armeabi/libst 
lport_static.a <- D:/Dropbox/Workspace/Eclipse/GhostEngine//obj/local/armeabi/li 
bstlport_static.a dependency dropped. 
SharedLibrary : libghost.so 
D:/Dropbox/Workspace/Eclipse/GhostEngine//obj/local/armeabi/objs/ghost/ImagePng. 
o: In function `loadPngFile': 
D:/Dropbox/Workspace/Eclipse/GhostEngine//jni/ghost/ImagePng.cpp:48: undefined r 
eference to `png_sig_cmp' 
D:/Dropbox/Workspace/Eclipse/GhostEngine//jni/ghost/ImagePng.cpp:55: undefined r 
eference to `png_create_read_struct' 
D:/Dropbox/Workspace/Eclipse/GhostEngine//jni/ghost/ImagePng.cpp:61: undefined r 
eference to `png_create_info_struct' 
D:/Dropbox/Workspace/Eclipse/GhostEngine//jni/ghost/ImagePng.cpp:68: undefined r 
eference to `png_create_info_struct' 
D:/Dropbox/Workspace/Eclipse/GhostEngine//jni/ghost/ImagePng.cpp:75: undefined r 
eference to `png_set_longjmp_fn' 
D:/Dropbox/Workspace/Eclipse/GhostEngine//jni/ghost/ImagePng.cpp:77: undefined r 
eference to `png_destroy_read_struct' 
D:/Dropbox/Workspace/Eclipse/GhostEngine//jni/ghost/ImagePng.cpp:63: undefined r 
eference to `png_destroy_read_struct' 
D:/Dropbox/Workspace/Eclipse/GhostEngine//jni/ghost/ImagePng.cpp:70: undefined r 
eference to `png_destroy_read_struct' 
collect2: ld returned 1 exit status 
make: *** [D:/Dropbox/Workspace/Eclipse/GhostEngine//obj/local/armeabi/libghost. 
so] Error 1 

我在的libpng android.mk看起來是這樣的:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_CFLAGS := 

LOCAL_MODULE := libpng 
LOCAL_SRC_FILES :=\ 
    png.c \ 
    pngerror.c \ 
    pngget.c \ 
    pngmem.c \ 
    pngpread.c \ 
    pngread.c \ 
    pngrio.c \ 
    pngrtran.c \ 
    pngrutil.c \ 
    pngset.c \ 
    pngtrans.c \ 
    pngwio.c \ 
    pngwrite.c \ 
    pngwtran.c \ 
    pngwutil.c 

LOCAL_LDLIBS := -lz 

include $(BUILD_STATIC_LIBRARY) 

Application.mk:

APP_PLATFORM := android-10 
STLPORT_FORCE_REBUILD := true 
APP_STL := stlport_static 
APP_MODULES := libpng ghost 
#APP_CPPFLAGS += -fexceptions 

的Android。 mk在我的項目文件夾中:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := ghost 
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp) 
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) 
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2 

# Support for additional libraries 
#LOCAL_CFLAGS := -DANDROID_NDK -Wno-psabi 
LOCAL_STATIC_LIBRARIES := android_native_app_glue 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libpng/ 
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -ldl 
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lz 

include $(BUILD_SHARED_LIBRARY) 

$(call import-module,android/native_app_glue) 

感謝您對此主題的幫助。 謝謝,馬丁。

回答

3

我想你可能需要添加「libpng」到LOCAL_STATIC_LIBRARIES變量。

如果這不起作用,請嘗試將-lpng添加到您的Android.mk文件中的LOCAL_LD_LIBS變量中。 (哪一個需要取決於libpng庫的放置位置。)

1

我不熟悉Makefile的Android版本,但問題是您沒有鏈接libpng。編譯器生成目標文件是因爲它具有libpng的頭文件,但它不知道它應該與libpng鏈接(嘗試添加-lpng)以及它的路徑(如果它不在默認位置)。