2012-06-29 44 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)以及它的路径(如果它不在默认位置)。