ところでQtの実行速度が、SDLより遅い気がします。今度は本家PC6001VをベースにGUIの部分を取り除いて、Androidに移植したいと思いました。
#ようするに、Qt CreatorでQtベースではなく、EclipseでSDLをベースにビルドし直します。
例によってSDLのサイトから、android-project.zipをダウンロードして解凍します。
http://www.libsdl.org/tmp/android-project.zip
プロジェクトは以下のフォルダ構成で解凍します。
android-project/jni/SDL/ android-project/jni/png/
以下はnecessitas/Android/Qt/482/armeabiよりフォルダをコピー
android-project/jni/external/include/ android-project/jni/external/lib/
以下はPC6001Vよりフォルダをコピー
android-project/jni/src/
以下のファイルはPC6001VXより上書きコピー
android-project/jni/src/SDL/osdSDL.cpp android-project/jni/src/Qt/osdQt.cpp android-project/jni/src/Qt/guiQt.cpp android-project/jni/src/Qt/common.cpp android-project/jni/src/Qt/console.cpp
以下のファイルを修正します。
android-project\src\org\libsdl.app\SDLActivity.java
// Load the .so static { System.loadLibrary("SDL"); /// System.loadLibrary("SDL_image"); /// System.loadLibrary("mikmod"); /// System.loadLibrary("SDL_mixer"); /// System.loadLibrary("SDL_ttf"); System.loadLibrary("QtCore"); System.loadLibrary("QtGui"); System.loadLibrary("main"); }
APIレベル4なのでOpenGLESv2は利用出来ません。
android-project\jni\SDL\Android.mk
###LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog LOCAL_LDLIBS := -ldl -lGLESv1_CM -llog -lz
android-project\jni\SDL\include\SDL_config_android.h
///#define SDL_VIDEO_RENDER_OGL_ES2 1 #define SDL_VIDEO_RENDER_OGL_ES2 0
android-project\default.properties
# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system use, # "build.properties", and override values to adapt the script to your # project structure. # Project target. #target=android-7 target=android-4
android-project\localproperties
# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must *NOT* be checked in Version Control Systems, # as it contains information specific to your local configuration. # location of the SDK. This is only used by Ant # For customization when using a Version Control System, please read the # header note. #sdk.dir=/Users/hercules/eclipse/android-sdk-mac_86 sdk.dir=C:\\android-sdk-windows\\sdk
画面の向き、SDカードへの書き込みなどを設定します。
android-project\AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.libsdl.app" android:versionCode="1" android:versionName="1.0"> <application android:label="@string/app_name" android:icon="@drawable/icon" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:debuggable="true"> <activity android:name="SDLActivity" android:label="@string/app_name" android:screenOrientation="landscape"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="4" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> </manifest>
Application.mk
APP_PLATFORM := android-4 APP_STL := gnustl_static APP_CPPFLAGS := -frtti -fexceptions APP_ABI := armeabi
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := QtCore LOCAL_SRC_FILES := ../external/lib/libQtCore.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := QtGui LOCAL_SRC_FILES := ../external/lib/libQtGui.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := main SDL_PATH := ../SDL LOCAL_C_INCLUDES := $(LOCAL_PATH)/../external/include \ $(LOCAL_PATH)/../external/include/QtCore \ $(LOCAL_PATH)/../external/include/QtGui \ $(LOCAL_PATH)/$(SDL_PATH)/include \ $(LOCAL_PATH)/../png # Add any compilation flags for your project here... LOCAL_CFLAGS := \ -DUSESDLTHREAD -DUSESDLCS -DUSESDLSEMAPHORE -DMAX_PATH=256 # Add your application source files here... LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.cpp \ breakpoint.cpp \ config.cpp \ cpum.cpp \ cpus.cpp \ d88.cpp \ debug.cpp \ device.cpp \ disk.cpp \ error.cpp \ graph.cpp \ ini.cpp \ intr.cpp \ io.cpp \ joystick.cpp \ keyboard.cpp \ memory.cpp \ movie.cpp \ p6t2.cpp \ pio.cpp \ psg.cpp \ replay.cpp \ schedule.cpp \ sound.cpp \ status.cpp \ tape.cpp \ vdg.cpp \ voice.cpp \ vsurface.cpp \ device/ay8910.cpp \ device/mc6847.cpp \ device/pd7752.cpp \ device/pd8255.cpp \ device/z80-dbg.cpp \ device/z80.cpp \ p6el.cpp \ p6vm.cpp \ semaphore.cpp \ thread.cpp \ SDL/osdSDL.cpp \ Qt/osdQt.cpp \ Qt/guiQt.cpp \ Qt/common.cpp \ Qt/console.cpp \ pc6001v.cpp LOCAL_SHARED_LIBRARIES := SDL QtCore QtGui LOCAL_STATIC_LIBRARIES := png LOCAL_LDLIBS := -lGLESv1_CM -llog -lz include $(BUILD_SHARED_LIBRARY)
ビルドしてみてエラーを消していきます。
osdSDL.cpp
#if SDL_VERSION_ATLEAST(2,0,0) static PCKEYsym VKTable[SDL_NUM_SCANCODES]; // SDLスキャンコード -> 仮想キーコード 変換テーブル #else ///static PCKEYsym VKTable[SDLK_LAST]; // SDLキーコード -> 仮想キーコード 変換テーブル static PCKEYsym VKTable[SDL_NUM_SCANCODES]; // SDLキーコード -> 仮想キーコード 変換テーブル #endif (省略) #if SDL_VERSION_ATLEAST(2,0,0) SDL_TimerID *pid = NULL; SDL_TimerID tid = SDL_AddTimer( interval, (SDL_TimerCallback)callback, param ); if( tid ){ pid = new SDL_TimerID; if( pid ) *pid = tid; } return (HTIMERID)pid; #else /// return (HTIMERID)SDL_AddTimer( interval, (SDL_NewTimerCallback)callback, param ); return (HTIMERID)SDL_AddTimer( interval, (SDL_TimerCallback)callback, param ); #endif (省略) #if SDL_VERSION_ATLEAST(2,0,0) event.type = SDL_FIRSTEVENT; #else /// event.type = SDL_NOEVENT; event.type = SDL_FIRSTEVENT; #endif
設定ファイルパス取得関数名を全て変えます。
osdQt.cpp
guiQt.cpp
const char *OSD_GetConfigPath();
↓
const char *OSD_GetModulePath();
osdQt.cpp
const char *OSD_GetModulePath( void ) { PRINTD( OSD_LOG, "[OSD][OSD_GetModulePath]\n" ); static char mpath[PATH_MAX] = ""; // モジュールパス取得用 //Windowsの場合はexe本体と同じ場所。 //それ以外(UNIX系を想定)は ~/.pc6001vx を返す #ifdef WIN32 QString confPath = qApp->applicationDirPath() + QDir::separator(); #else QString confPath = QDir::homePath() + QDir::separator() + QString(".pc6001vx"); #endif sprintf( mpath, "%s", confPath.toUtf8().data() ); AddDelimiter( mpath ); // 念のため UnDelimiter( mpath ); return mpath; } (省略) #ifdef WIN32 QString confPath = qApp->applicationDirPath() + QDir::separator(); #else /// QString confPath = QDir::homePath() + QDir::separator() + QString(".pc6001vx"); QString confPath = QString("/sdcard"); #endif
guiQt.cpp
/// #include "configdialog.h" /// #include "aboutdialog.h" (省略) case ID_VERSION: // バージョン情報 /// AboutDialog dialog(cfg); /// dialog.exec(); break; } (省略) /* ConfigDialog dialog(ecfg); dialog.exec(); int ret = dialog.result(); // OKボタンが押されたならINIファイル書込み if( ret == QDialog::Accepted) ecfg->Write(); delete ecfg; ecfg = NULL; return ret; */ return -1;
pc6001v.cpp
// 二重起動禁止 /// if( OSD_IsWorking() ) return false;
これでビルドは通りますが、実行すると画面が真っ暗です。原因究明しないと、、、