【问题标题】:Undefined reference to android_main (Android NDK - native_app_glue)对 android_main 的未定义引用(Android NDK - native_app_glue)
【发布时间】:2012-05-04 19:20:23
【问题描述】:

我正在完全用 C++ 编写一个 Android 应用程序。使用 OpenGL E.S. 2、Android-NDK r7(platform-9)、OpenJDK、Ubuntu 12.04。

我遇到的问题是我应该调用我正在开发的引擎的主库正在吐出“对android_main 的未定义引用”错误。为什么这样做我不知道,但我几乎可以肯定它与我的 Android.mk 有一些关系。无论出于何种原因,我都无法弄清楚。

虽然引擎库构建得非常好,但引用构成实际游戏的文件的主 Android.mk 并没有按照我希望的方式构建。

目标

-我希望它与-loptim 链接,因此它可以引用和调用来自引擎的函数作为单独的库。因此,我应该能够将此引擎移植到其他各种项目并简单地链接它。这似乎已经完成,但如果其他人有更好的方法来完成这件事,我会全力以赴。

-我还想弄清楚为什么我的 android_main 没有被引用,以及可以做些什么来修复它。

Main.cpp

#include "engine/stdafx.hpp"
#include "engine/AppData.hpp"
#include "engine/Engine.hpp"
#include "glm/glm.hpp"

using namespace optim;

void android_main( android_app* application )
{
    AppData appData;
    appData.mApplication = application;
    appData.mGraphicsService = new GraphicsService( application );

    Engine app( &appData );
}

Android.mk

MY_LOCAL_PATH := $(call my-dir)

LOCAL_PATH := $(MY_LOCAL_PATH)

include $(CLEAR_VARS)

include $(LOCAL_PATH)/engine/Android.mk

include $(CLEAR_VARS)

LOCAL_PATH := $(MY_LOCAL_PATH)

LOCAL_CFLAGS    := -I$(LOCAL_PATH)/glm -I$(ANDROID_NDK)/sources/cxx-stl/stlport/stlport -I$(LOCAL_PATH)/ -I$(LOCAL_PATH)/engine
LOCAL_MODULE    := pongdroid 
LOCAL_SRC_FILES := Main.cpp PongDroid.cpp
LOCAL_LDLIBS    := -landroid -llog -lEGL -lGLESv2 -L$(PONGDROID_DEV)/obj/local/armeabi/ -loptim
LOCAL_STATIC_LIBRARIES := android_native_app_glue

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

请注意,-loptim 是我将主模块链接到的引擎的共享库。问题在于,虽然它看起来链接得很好,但这个makefile 的库尤其不会产生shared_library。然而,其他一切似乎都编译得很好。

NDK 构建

**** Build of configuration Default for project pongdroid ****

ndk-build all 
Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Compile++ thumb  : optim <= Engine.cpp
Compile++ thumb  : optim <= Config.cpp
Compile++ thumb  : optim <= GraphicsService.cpp
Compile thumb  : android_native_app_glue <= android_native_app_glue.c
StaticLibrary  : libandroid_native_app_glue.a
StaticLibrary  : libstdc++.a
SharedLibrary  : liboptim.so
./obj/local/armeabi/libandroid_native_app_glue.a(android_native_app_glue.o): In function `android_app_entry':
/home/amsterdam/Android/android-ndk/sources/android/native_app_glue/android_native_app_glue.c:234: undefined reference to `android_main'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/liboptim.so] Error 1

**** Build Finished ****

更新

所以,我已经缩小了问题的范围。问题在于根 Android.mk 文件出于某种原因似乎忽略了自己的库。更奇怪的是,当我注释掉include $(LOCAL_PATH)/engine/Android.mk时,错误输出变得更糟了。

所以,为了清楚起见,我发布了我的engine/Android.mk 文件,看看是否有人能理解这个混乱......

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS    := -I$(LOCAL_PATH)/
LOCAL_MODULE    := optim
LOCAL_SRC_FILES := Engine.cpp Config.cpp GraphicsService.cpp 
LOCAL_LDLIBS := -landroid -llog -lEGL -lGLESv2
LOCAL_STATIC_LIBRARIES := android_native_app_glue

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue) 

更新 2

从 shell 调用 ndk-build pongdroid

ndk-build pongdroid
Compile++ thumb  : pongdroid <= Main.cpp
Compile++ thumb  : pongdroid <= PongDroid.cpp
SharedLibrary  : liboptim.so
/home/amsterdam/Programming/Android/pongdroid/obj/local/armeabi/libandroid_native_app_glue.a(android_native_app_glue.o): In function `android_app_entry':
/home/amsterdam/Android/android-ndk/sources/android/native_app_glue/android_native_app_glue.c:234: undefined reference to `android_main'
collect2: ld returned 1 exit status
make: *** [/home/amsterdam/Programming/Android/pongdroid/obj/local/armeabi/liboptim.so] Error 1

【问题讨论】:

    标签: c++ android-ndk undefined-reference


    【解决方案1】:

    您是在 Main.cpp 中包含“android_native_app_glue.h”标头还是其中包含的标头之一?

    【讨论】:

    • 是的;它包含在stdafx.hpp 中。从那里,我认为我应该将它直接包含到 Main.cpp 以防万一。不过,没有骰子。
    • 我在 ndk-build 输出中看不到 Main.cpp。它在优化库中吗?然后你应该通过 LOCAL_SHARED_LIBRARIES 引用这个库(就像你将 android_native_app_glue 作为静态库一样),而不是手动将它放入 LOCAL_LDLIBS 变量中。
    • 实际上并非如此,但这可能就是问题所在。我会试试的。
    • 刚刚更新了我的答案。您是否在第二个 Android.mk 中看到任何可能存在问题的内容?
    • 是的,这是错误的。您正在将 optim 链接到 native_app_glue,这需要您提供 android_main。但我了解 Engine、Config 和 GraphicsService 不提供它。只有 Main 可以。但 optim 不包含 Main.cpp 文件。
    猜你喜欢
    • 2012-07-18
    • 2019-03-08
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多