私は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
それは 'stdafx.hpp'から含まれています。そこから、私はMain.cppに直接それを含めるべきだと思った。それでも、ダイスはありません。 – zeboidlund
ndk-build出力にMain.cppが表示されません。それは最適ライブラリにありますか?次に、LOCAL_LDLIBS変数に手動で入れるのではなく、LOCAL_SHARED_LIBRARIES(静的なlibとしてandroid_native_app_glueの場合と同じように)でこのライブラリを参照する必要があります。 –
実際にはそうではありませんが、それはそれを台無しにするかもしれません。私はそれを試みます。 – zeboidlund