Herkese selam. Bugün Android'de oyun çalıştırmak için sdl2 kütüphanesini kullanarak proje nasıl hazırlanır ona bakacağız.
Öncelikle Android Studio'yu indirmeniz, yüklemeniz ve bu geliştirme ortamında gereken her şeyi yapmanız gerekir. Örneğin, artık Kde Neon'um var ve bu sistemde /etc/environment dosyası var, aynı dosya ubuntu'da da mevcut. Buraya aşağıdaki değişkenlerin girilmesi gerekir.
ANDROID_HOME=/home/username/Android/Sdk
ANDROID_NDK_HOME=/home/username/ndk
Ayrıca NDK'yı resmi web sitesinden indirmeniz, paketini ana dizininize açmanız ve NDK olarak yeniden adlandırmanız gerekir. Daha sonra web sitesinden SDL2 kütüphanesini indirmeniz gerekiyor.
Android'deki dosyaları varlıklardan okumak için SDL_RWops işlevlerini kullanmanız gerekir. Burada bir yazı tipiyle çalışmak için kodda kullanım örneği verilmiştir. Bu durumda FT_New_Face'i kullanamayız ancak bunun yerine daha önce okunmuş olan verileri kullanmak için FT_New_Memory_Face'i kullanacağız.
#ifdef __ANDROID__
snprintf ( path, 254, "fonts/%s", file );
SDL_RWops *rw = SDL_RWFromFile(path, "r" );
char *memory = ( char * ) calloc ( rw->hidden.androidio.size, 1 );
SDL_RWread(rw, memory, 1, rw->hidden.androidio.size );
FT_New_Memory_Face(*this->ft_library, ( const FT_Byte * )memory, rw->hidden.androidio.size, 0, &this;->face );
SDL_RWclose(rw);
free ( memory );
#else
snprintf ( path, 254, "%s/fonts/%s", DEFAULT_ASSETS, file );
if ( access ( path, F_OK ) ) {
fprintf ( stderr, "not found font: %sn", path );
exit ( EXIT_FAILURE );
}
struct stat st;
stat ( path, &st; );
FILE *rw = fopen ( path, "r" );
char *memory = ( char * ) calloc ( st.st_size, 1 );
fread ( memory, 1, st.st_size, rw );
FT_New_Memory_Face ( *this->ft_library, ( const FT_Byte * ) memory, st.st_size, 0, &this;->face );
fclose ( rw );
free ( memory );
#endif
Ayrıca SDL2 başlıklarını bağlamak için bir başlık dosyası oluşturdum. Derlemenin Android'de başarılı olması için NO_SDL_GLEXT gereklidir.
#ifdef __ANDROID__
#include "SDL.h"
#include "SDL_video.h"
#include "SDL_events.h"
#define NO_SDL_GLEXT
#include "SDL_opengl.h"
#include "SDL_opengles2.h"
#else
#include <SDL2/SDL.h>
#include <SDL2/SDL_video.h>
#include <SDL2/SDL_opengl.h>
#include <SDL2/SDL_opengles2.h>
#endif
Böylece proje hazır, gölgelendiriciler Opengl Es 3.0 için hazır. Şimdi bir Android projesi oluşturmamız gerekiyor. Bunu yapmak için SDL2 arşivini açın. Derleme komut dosyalarına gidin. Ve bunu şu şekilde yapıyoruz.
./androidbuild.sh com.xverizex.test main.cpp
Aşağıdaki mesaj görünecektir.
To build and install to a device for testing, run the following:
cd /home/cf/programs/SDL2-2.0.10/build/com.xverizex.test
./gradlew installDebug
Com.xverizex.test'e gidin. com.xverizex.test/app/jni/src adresine gidin. Oyun projemizi kopyalıyoruz. Ve Android.mk dosyasını değiştiriyoruz, benim durumumda şöyle görünüyor.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
SDL_PATH := ../SDL
FREETYPE_PATH := ../Freetype2
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include $(LOCAL_PATH)/$(FREETYPE_PATH)/include
# Add your application source files here...
LOCAL_SRC_FILES := ./engine/lang.cpp ./engine/actor.cpp ./engine/sprite.cpp ./engine/shaders.cpp ./engine/box.cpp ./engine/menubox.cpp ./engine/load_manager.cpp ./engine/main.cpp ./engine/font.cpp ./engine/model.cpp ./engine/button.cpp ./theme.cpp ./level_manager.cpp ./menu/menu.cpp
LOCAL_SHARED_LIBRARIES := SDL2 Freetype2
LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog
include $(BUILD_SHARED_LIBRARY)
Zaten fark etmiş olabileceğiniz gibi Freetype2 kütüphanesini de dahil ediyorum. Android için github'da hazır bir tane buldum ama işe yaramadı, bir şeyi değiştirmem gerekiyordu. Ayrıca bir app/src/main/assets dizini oluşturuyoruz. Kaynaklarımızı (fontlar, spritelar, 3D modeller) içine yerleştiriyoruz.
Şimdi Android için Freetype2'yi yapılandıralım. github'ımdan indir
Kaynak: habr.com