SMGhost
SMGhost

Reputation: 4037

Linking libpng to android native project

I am having problems trying to load libpng in my native android project. It seems, that the compiler doesn't recognize libpng functions, but does recognize types (like png_byte). It compiles normally with types, but throws errors if I add functions.

Here's compile output (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

My android.mk in libpng looks like this:

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 in my project folder:

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)

I appreciate your help regarding this subject. Thanks, Martin.

Upvotes: 2

Views: 4740

Answers (2)

Gabi
Gabi

Reputation: 598

I'm not familiar with Makefile's for Android but your problem is that you didn't link with libpng. The compiler makes the object files because it has the header files for libpng but it doesn't know it should link with libpng (try adding -lpng) and the path to it if it's not in the default location.

Upvotes: 1

Turix
Turix

Reputation: 4490

I think you may need to add "libpng" to the LOCAL_STATIC_LIBRARIES variable.

If that doesn't work, instead try adding -lpng to your LOCAL_LD_LIBS variable in your Android.mk file. (Which one is needed depends on where the libpng library is put.)

Upvotes: 3

Related Questions