2

ネイティブのAndroidプロジェクトでlibpngを読み込もうとして問題が発生しました。コンパイラはlibpng関数を認識しないようですが、型(png_byteなど)は認識します。通常は型でコンパイルされますが、関数を追加するとエラーが発生します。

コンパイル出力は次のとおりです(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)

この件に関してご協力いただきありがとうございます。ありがとう、マーティン。

4

2 に答える 2

3

LOCAL_STATIC_LIBRARIES変数に「libpng」を追加する必要があると思います。

それでも問題が解決しない場合は、代わりに-lpngAndroid.mkファイルのLOCAL_LD_LIBS変数に追加してみてください。(どちらが必要かは、libpngライブラリが配置されている場所によって異なります。)

于 2012-06-29T16:57:25.857 に答える
1

私はMakefileAndroid用のに精通していませんが、あなたの問題はあなたがlibpngとリンクしていなかったことです。-lpngコンパイラは、libpngのヘッダーファイルがあるため、オブジェクトファイルを作成しますが、libpng(追加してみてください)およびデフォルトの場所にない場合はそのパスにリンクする必要があるかどうかはわかりません。

于 2012-06-29T17:58:05.730 に答える