2012-04-24 16 views
1

私はAndroidアプリケーションをC++で完全に書いています。 OpenGL E.S.の使用2、Android-NDK r7(プラットフォーム-9)、OpenJDK、およびUbuntu 12.04です。android_main(Android NDK - native_app_glue)への未定義の参照

私が実行している問題は、私が開発しているエンジンを呼び出す予定の私のメインライブラリが "android_mainへの未定義参照"エラーを吐き出していることです。なぜこれをやっているのかわかりませんが、私はAndroid.mkと何か関係があることはほぼ肯定的です。何らかの理由で、私はそれを理解できません。

エンジンライブラリは完全にうまく構築されていますが、実際のゲームを構成するファイルを参照するAndroid.mkの主要な部分は、私が望むような方法で構築されていません。

目標

このよう-I'dは、それが別のライブラリとして、エンジンからの関数を参照し、呼び出すことが-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は私がメインモジュールをリンクしていますエンジンの共有ライブラリであることに注意してください。問題は、が完全に正常にリンクするためにと表示されますが、特にこのメイクファイルのライブラリはshared_libraryを生成しません。しかし、他のすべてはうまくコンパイルされているようです。

NDK-BUILD

**** 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

シェルから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 

答えて

1

あなたが「android_native_app_glue.h」MAIN.CPPのヘッダーまたはその付属ヘッダーの1つを含めていますか?

+0

それは 'stdafx.hpp'から含まれています。そこから、私はMain.cppに直接それを含めるべきだと思った。それでも、ダイスはありません。 – zeboidlund

+0

ndk-build出力にMain.cppが表示されません。それは最適ライブラリにありますか?次に、LOCAL_LDLIBS変数に手動で入れるのではなく、LOCAL_SHARED_LIBRARIES(静的なlibとしてandroid_native_app_glueの場合と同じように)でこのライブラリを参照する必要があります。 –

+0

実際にはそうではありませんが、それはそれを台無しにするかもしれません。私はそれを試みます。 – zeboidlund

関連する問題