AndroidNDK,两个静态库和链接

AndroidNDK,两个静态库和链接,android,shared-libraries,static-libraries,android-ndk,Android,Shared Libraries,Static Libraries,Android Ndk,我开始创建共享库,但我认为创建一个共享库和其他静态库更有效。当它被全部共享时,它被编译并链接得很好,但转到静态,我开始链接“未定义的引用” 编辑:我在一个Android.mk Android.mk: MY_LOCAL_PATH := $(call my-dir) MY_LOCAL_CFLAGS := -DDEBUG TARGET_PLATFORM := 'android-4' LOCAL_PATH := $(MY_LOCAL_PATH)/../../Base include $(CLEAR

我开始创建共享库,但我认为创建一个共享库和其他静态库更有效。当它被全部共享时,它被编译并链接得很好,但转到静态,我开始链接“未定义的引用”

编辑:我在一个
Android.mk

Android.mk:

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)
Edit2:TextureRenderer包含在图形中,包括在内


有人知道它为什么不工作以及如何修复吗?

在您的
Android.mk
中,请确保使用正确的调用引用静态库:

LOCAL_STATIC_LIBRARIES := mystaticlibproj
调用include
$(构建共享库)
之前

然后,在文件的末尾,调用导入静态lib模块

$(call import-module, mystaticlibproj)

如果您仍然有问题,请发布详细的构建日志(
ndk build V=1-B
)和您的
Android.mk

,这看起来像是链接问题的顺序

您的命令行是:

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

libPlatform.a(ATexture.o): In function `ATexture':
ATexture.cpp:9: undefined reference to `TextureRenderer'
ATexture.cpp:9: undefined reference to `TextureRenderer'
TextureRenderer在图形中。但是libGraphics在命令行中位于libPlatform之前。g++将在命令行中按照给定的顺序搜索每个库,加载函数以解析外部引用。它将读取一次libGraphics,加载解析外部引用的函数,然后移动到libPlatform


尝试将
LOCAL\u STATIC\u库:=$(MY\u LOCAL\u STATIC\u库)
更改为
LOCAL\u STATIC\u库:=Platform Graphics Framework Base
,看看你的进展如何。

我应该提到,我在一个Android中编译了所有库。首先,我要仔细检查Texturenderer是否确实在libGraphics.a中,虽然可能是。使用/Users/robbie/Library/Frameworks/Android NDK/toolschains/arm-linux-androideabi-4.4.3/prebuild/darwin-x86/bin/arm-linux-androideabi-nm在库中转储符号一个共享库比多个共享库有什么好处,除了必须键入更多的System.loadLibrary()?我没有你的问题,我只是不知道如何生成链接的静态库。谢谢你的例子。
libPlatform.a(ATexture.o): In function `ATexture':
ATexture.cpp:9: undefined reference to `TextureRenderer'
ATexture.cpp:9: undefined reference to `TextureRenderer'