2011-01-22 22 views
11

Paylaşılan kitaplıklar olarak kütüphaneler oluşturmaya başladım, ancak paylaşılan bir kitaplık ve geri kalan statik oluşturmak daha verimli olacağını düşündüm. Tüm paylaşıldığı zaman, iyi bir şekilde derlenmiş ve bağlanmıştı, ancak statik olarak hareket ettiğimde, "tanımlanmamış başvuruyu" bağlamaya başladım.Android NDK, iki Statik Kitaplık ve Bağlantı

Düzenleme: Bir Android.mk

Android.mk tüm kütüphaneleri oluşturmak:

MY_LOCAL_PATH := $(call my-dir) 
MY_LOCAL_CFLAGS := -DDEBUG 

TARGET_PLATFORM := 'android-4' 

LOCAL_PATH := $(MY_LOCAL_PATH)/../../Base 

include $(CLEAR_VARS) 

LOCAL_MODULE  := Base 
LOCAL_SRC_FILES := <Base src files> 
include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES := Base 

MY_LOCAL_C_INCLUDES := $(MY_LOCAL_PATH)/../../Base 

LOCAL_PATH := $(MY_LOCAL_PATH)/../../Framework 

include $(CLEAR_VARS) 

LOCAL_MODULE  := Framework 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 
LOCAL_SRC_FILES := <Framework src files> 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 

include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES += Framework 

MY_LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/../../Framework 

LOCAL_PATH := $(MY_LOCAL_PATH)/Graphics 

include $(CLEAR_VARS) 

LOCAL_MODULE := Graphics 
LOCAL_SRC_FILES := <Graphics src files> 
LOCAL_EXPORT_LDLIBS := -lGLESv1_CM 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 

include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES += Graphics 

MY_LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/Graphics 

LOCAL_PATH := $(MY_LOCAL_PATH)/Platform 

include $(CLEAR_VARS) 

LOCAL_MODULE := Platform 
LOCAL_SRC_FILES := <Platform src files> 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 

include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES += Platform 

MY_LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/Platform 

LOCAL_PATH := $(MY_LOCAL_PATH) 

include $(CLEAR_VARS) 

LOCAL_MODULE := Final 
LOCAL_SRC_FILES := <Final src files> 
LOCAL_STATIC_LIBRARIES := $(MY_LOCAL_STATIC_LIBRARIES) 
LOCAL_LDLIBS := -llog 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 

include $(BUILD_SHARED_LIBRARY) 

Son çizgi ndk-build V=1 -B arasında:

SharedLibrary : libFinal.so 
/Users/robbie/Library/Frameworks/Android-NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++ -Wl,-soname,libFinal.so -shared --sysroot=/Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm <object files> /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libBase.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libFramework.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libGraphics.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libPlatform.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libstdc++.a /Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib/libc.so /Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib/libstdc++.so /Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib/libm.so -Wl,--no-undefined -Wl,-z,noexecstack -L/Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib -llog -lGLESv1_CM -lstdc++ -Wl,-rpath-link=/Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib -lsupc++ -o /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libFinal.so 
/Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libPlatform.a(ATexture.o): In function `ATexture': 
/Users/robbie/Documents/Apps/Revolution/Android/jni/SpinTap/ATexture.cpp:9: undefined reference to `TextureRenderer::TextureRenderer(unsigned int)' 
/Users/robbie/Documents/Apps/Revolution/Android/jni/SpinTap/ATexture.cpp:9: undefined reference to `TextureRenderer::TextureRenderer(unsigned int)' 

EDIT2: TextureRenderer içindedir Dahil olan grafikler.

Neden çalışmadığı ve nasıl düzeltilebileceği konusunda bir fikri olan var mı? senin Android.mk yılında

+0

Daha fazla System.loadLibrary() yazmak zorunda kalmanın yanı sıra, bir çoğunda bir paylaşılan kitaplığın yararı var mı? – NebulaFox

+0

Sorununuz yoktu, sadece bağlantı vermek için statik kitaplığı nasıl oluşturacağımı bilmiyordum. Örnek için teşekkürler. –

cevap

12

Bu, bana bir bağlantı düzeni sorunu gibi görünüyor.

arm-linux-androideabi-g++ -Wl,-soname,libFinal.so -shared \ 
    libBase.a libFramework.a libGraphics.a libPlatform.a -o libFinal.so 

ve hata

libPlatform.a(ATexture.o): In function `ATexture': 
ATexture.cpp:9: undefined reference to `TextureRenderer' 
ATexture.cpp:9: undefined reference to `TextureRenderer' 

TextureRenderer Grafik içindedir geçerli:

hakimiyetin çizgidir. Ama libGraphics, komut satırında libPlatform'dan önce. g ++, her bir kütüphaneyi komut satırında verilen sırayla arayacak, harici referansları çözmek için fonksiyonlar yükleyecektir. Bir kez libGraphics okuyacak, dış referansları çözen fonksiyonları yükleyecek ve libPlatform'a geçecektir.

LOCAL_STATIC_LIBRARIES := $(MY_LOCAL_STATIC_LIBRARIES)'u LOCAL_STATIC_LIBRARIES := Platform Graphics Framework Base olarak değiştirmeyi deneyin ve nasıl devam edeceğinizi görün.

2

, doğru çağrıyla statik kütüphane başvuran emin olun:

LOCAL_STATIC_LIBRARIES := mystaticlibproj 

$(BUILD_SHARED_LIBRARY) dahil çağırmadan önce. Hala sorun yaşıyorsanız, ayrıntılı inşa günlüğünü (ndk-build V=1 -B) ve Android.mk

sonrası

$(call import-module, mystaticlibproj) 

Sonra dosyanın sonuna statik lib modülünü almak için aramayı

+0

Bir Android.mk – NebulaFox

+0

'daki tüm kütüphaneleri derlediğimi belirtmeliydim İlk olarak, TextureRenderer'ın gerçekten de libGraphics.a'da olduğundan emin olabilirdim. Kütüphanedeki sembolleri dökmek için /Users/robbie/Library/Frameworks/Android-NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-nm kullanın – levis501

İlgili konular