私は完全にC++でAndroidアプリを書いています。OpenGL ES 2、Android-NDK r7(プラットフォーム-9)、OpenJDK、およびUbuntu12.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
**** 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