Commit 8ffa21a9 authored by kenan's avatar kenan

jni delete point

parent 559f07f0
...@@ -44,9 +44,24 @@ void Game::process(irr::SEvent &event) { ...@@ -44,9 +44,24 @@ void Game::process(irr::SEvent &event) {
} }
} }
Game::~Game(){
#ifdef _IRR_ANDROID_PLATFORM_
if(gameHost != NULL) {
delete gameHost;
gameHost = NULL;
}
if(gameUI != NULL) {
delete gameUI;
gameUI = NULL;
}
#endif
if(soundEffectPlayer != NULL){
delete soundEffectPlayer;
soundEffectPlayer = NULL;
}
}
#ifdef _IRR_ANDROID_PLATFORM_ #ifdef _IRR_ANDROID_PLATFORM_
AndroidGameHost *gameHost;
AndroidGameUI *gameUI;
bool Game::Initialize(ANDROID_APP app) { bool Game::Initialize(ANDROID_APP app) {
this->appMain = app; this->appMain = app;
#else #else
...@@ -57,6 +72,11 @@ bool Game::Initialize() { ...@@ -57,6 +72,11 @@ bool Game::Initialize() {
#ifdef _IRR_ANDROID_PLATFORM_ #ifdef _IRR_ANDROID_PLATFORM_
JNIEnv* jni = android::getJniEnv(app); JNIEnv* jni = android::getJniEnv(app);
gameHost = new ygo::AndroidGameHost(app);
gameHost->initMethods(jni);
gameUI = new ygo::AndroidGameUI(app);
gameUI->initMethods(jni);
irr::android::InitOptions* options = gameUI->getInitOptions(jni); irr::android::InitOptions* options = gameUI->getInitOptions(jni);
if(options == NULL){ if(options == NULL){
return false; return false;
...@@ -1208,7 +1228,6 @@ void Game::MainLoop() { ...@@ -1208,7 +1228,6 @@ void Game::MainLoop() {
usleep(500000); usleep(500000);
#endif #endif
SaveConfig(); SaveConfig();
delete soundEffectPlayer;
usleep(500000); usleep(500000);
// device->drop(); // device->drop();
} }
......
...@@ -117,6 +117,7 @@ public: ...@@ -117,6 +117,7 @@ public:
#else #else
bool Initialize(); bool Initialize();
#endif #endif
~Game();
void MainLoop(); void MainLoop();
void RefreshTimeDisplay(); void RefreshTimeDisplay();
void BuildProjectionMatrix(irr::core::matrix4& mProjection, f32 left, f32 right, f32 bottom, f32 top, f32 znear, f32 zfar); void BuildProjectionMatrix(irr::core::matrix4& mProjection, f32 left, f32 right, f32 bottom, f32 top, f32 znear, f32 zfar);
...@@ -555,7 +556,6 @@ public: ...@@ -555,7 +556,6 @@ public:
void setLastDeck(const char* name); void setLastDeck(const char* name);
int getLocalAddr(); int getLocalAddr();
void playSoundEffect(const char *name); void playSoundEffect(const char *name);
JNIEnv* getJniEnv(); JNIEnv* getJniEnv();
...@@ -590,18 +590,17 @@ public: ...@@ -590,18 +590,17 @@ public:
return y2; return y2;
} }
void process(irr::SEvent &event); void process(irr::SEvent &event);
#ifdef _IRR_ANDROID_PLATFORM_
ygo::AndroidGameHost *gameHost;
ygo::AndroidGameUI *gameUI;
#endif
private: private:
int touchLeft; int touchLeft;
int touchTop; int touchTop;
io::path cardImagePath; io::path cardImagePath;
io::path resourcePath; io::path resourcePath;
}; };
extern Game *mainGame; extern Game *mainGame;
#ifdef _IRR_ANDROID_PLATFORM_
extern ygo::AndroidGameHost *gameHost;
extern ygo::AndroidGameUI *gameUI;
#endif
} }
#define CARD_IMG_WIDTH 177 #define CARD_IMG_WIDTH 177
......
...@@ -12,47 +12,8 @@ bool bot_mode = false; ...@@ -12,47 +12,8 @@ bool bot_mode = false;
#ifdef _IRR_ANDROID_PLATFORM_ #ifdef _IRR_ANDROID_PLATFORM_
ygo::AndroidGameHost *getGameHost(JNIEnv *env, jobject activity, jclass clazz, ANDROID_APP app) {
jmethodID getNativeGameHost = env->GetMethodID(clazz,
"getNativeGameHost", "()Lcn/garymb/ygomobile/interfaces/GameHost;");
jobject jhost = env->CallObjectMethod(activity, getNativeGameHost);
if(jhost) {
ygo::AndroidGameHost *host = new ygo::AndroidGameHost(app, env->NewGlobalRef(jhost));
host->initMethods(env);
return host;
}
return NULL;
}
ygo::AndroidGameUI *getGameUI(JNIEnv *env, jobject activity, jclass clazz, ANDROID_APP app) {
jmethodID getNativeGameHost = env->GetMethodID(clazz,
"getNativeGameUI", "()Lcn/garymb/ygomobile/interfaces/IGameUI;");
jobject jhost = env->CallObjectMethod(activity, getNativeGameHost);
if(jhost) {
ygo::AndroidGameUI *host = new ygo::AndroidGameUI(app, env->NewGlobalRef(jhost));
host->initMethods(env);
return host;
}
return NULL;
}
void android_main(ANDROID_APP app){ void android_main(ANDROID_APP app){
JNIEnv *env = android::getJniEnv(app);
jobject activity = app->activity->clazz;
jclass clazz = env->GetObjectClass(activity);
ygo::gameHost = getGameHost(env, activity, clazz, app);
ygo::gameUI = getGameUI(env, activity, clazz, app);
env->DeleteLocalRef(clazz);
if(!ygo::gameHost){
LOGE("Initialize game host error");
return;
}
if(!ygo::gameUI){
LOGE("Initialize game ui error");
return;
}
#else #else
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
#endif #endif
...@@ -112,7 +73,8 @@ int main(int argc, char* argv[]) { ...@@ -112,7 +73,8 @@ int main(int argc, char* argv[]) {
} }
} }
#else #else
irr::android::YGOGameOptions* options = ygo::gameUI->getJoinOptions(env); JNIEnv *env = android::getJniEnv(app);
irr::android::YGOGameOptions* options = ygo::mainGame->gameUI->getJoinOptions(env);
if(options != NULL){ if(options != NULL){
irr::SEvent event; irr::SEvent event;
wchar_t wbuff[256]; wchar_t wbuff[256];
...@@ -145,6 +107,7 @@ int main(int argc, char* argv[]) { ...@@ -145,6 +107,7 @@ int main(int argc, char* argv[]) {
#endif #endif
game->MainLoop(); game->MainLoop();
delete game; delete game;
game = NULL;
LOGI("end game"); LOGI("end game");
#ifdef _WIN32 #ifdef _WIN32
WSACleanup(); WSACleanup();
...@@ -152,9 +115,6 @@ int main(int argc, char* argv[]) { ...@@ -152,9 +115,6 @@ int main(int argc, char* argv[]) {
#endif //_WIN32 #endif //_WIN32
#ifdef _IRR_ANDROID_PLATFORM_ #ifdef _IRR_ANDROID_PLATFORM_
LOGI("clean host");
delete ygo::gameUI;
delete ygo::gameHost;
return; return;
#else #else
return EXIT_SUCCESS; return EXIT_SUCCESS;
......
...@@ -10,24 +10,24 @@ ...@@ -10,24 +10,24 @@
using namespace ygo; using namespace ygo;
AndroidGameHost::AndroidGameHost(ANDROID_APP _app, jobject _host) { AndroidGameHost::AndroidGameHost(ANDROID_APP _app) {
host = _host;
app = _app; app = _app;
} }
AndroidGameHost::~AndroidGameHost() { AndroidGameHost::~AndroidGameHost() {
JNIEnv *env = irr::android::getJniEnv(app); app = NULL;
env->DeleteGlobalRef(host); // JNIEnv *env = irr::android::getJniEnv(app);
// env->DeleteGlobalRef(app->activity->clazz);
} }
void AndroidGameHost::initMethods(JNIEnv *env) { void AndroidGameHost::initMethods(JNIEnv *env) {
jclass clazz = env->GetObjectClass(host); jclass clazz = env->GetObjectClass(app->activity->clazz);
java_getSetting = env->GetMethodID(clazz, "getSetting", java_getSetting = env->GetMethodID(clazz, "getSetting",
"(Ljava/lang/String;)Ljava/lang/String;"); "(Ljava/lang/String;)Ljava/lang/String;");
java_getIntSetting = env->GetMethodID(clazz, "getIntSetting", "(Ljava/lang/String;I)I"); java_getIntSetting = env->GetMethodID(clazz, "getIntSetting", "(Ljava/lang/String;I)I");
java_saveIntSetting = env->GetMethodID(clazz, "saveIntSetting", "(Ljava/lang/String;I)V"); java_saveIntSetting = env->GetMethodID(clazz, "saveIntSetting", "(Ljava/lang/String;I)V");
java_runWindbot = env->GetMethodID(clazz, "runWindbot", "(Ljava/lang/String;)V");
java_saveSetting = env->GetMethodID(clazz, "saveSetting", "(Ljava/lang/String;Ljava/lang/String;)V"); java_saveSetting = env->GetMethodID(clazz, "saveSetting", "(Ljava/lang/String;Ljava/lang/String;)V");
java_runWindbot = env->GetMethodID(clazz, "runWindbot", "(Ljava/lang/String;)V");
java_getLocalAddr = env->GetMethodID(clazz, "getLocalAddr", "()I"); java_getLocalAddr = env->GetMethodID(clazz, "getLocalAddr", "()I");
env->DeleteLocalRef(clazz); env->DeleteLocalRef(clazz);
} }
...@@ -38,7 +38,7 @@ irr::io::path AndroidGameHost::getSetting(JNIEnv *env, const char *_key) { ...@@ -38,7 +38,7 @@ irr::io::path AndroidGameHost::getSetting(JNIEnv *env, const char *_key) {
return ret; return ret;
} }
jstring key = env->NewStringUTF(_key); jstring key = env->NewStringUTF(_key);
jstring value = (jstring) env->CallObjectMethod(host, java_getSetting, key); jstring value = (jstring) env->CallObjectMethod(app->activity->clazz, java_getSetting, key);
if (key) { if (key) {
env->DeleteLocalRef(key); env->DeleteLocalRef(key);
} }
...@@ -55,7 +55,7 @@ int AndroidGameHost::getIntSetting(JNIEnv *env, const char *_key, int defvalue) ...@@ -55,7 +55,7 @@ int AndroidGameHost::getIntSetting(JNIEnv *env, const char *_key, int defvalue)
return 0; return 0;
} }
jstring key = env->NewStringUTF(_key); jstring key = env->NewStringUTF(_key);
jint value = env->CallIntMethod(host, java_getIntSetting, key, defvalue); jint value = env->CallIntMethod(app->activity->clazz, java_getIntSetting, key, defvalue);
if (key) { if (key) {
env->DeleteLocalRef(key); env->DeleteLocalRef(key);
} }
...@@ -67,7 +67,7 @@ void AndroidGameHost::saveIntSetting(JNIEnv *env, const char *_key, int value) { ...@@ -67,7 +67,7 @@ void AndroidGameHost::saveIntSetting(JNIEnv *env, const char *_key, int value) {
return; return;
} }
jstring key = env->NewStringUTF(_key); jstring key = env->NewStringUTF(_key);
env->CallVoidMethod(host, java_saveIntSetting, key, value); env->CallVoidMethod(app->activity->clazz, java_saveIntSetting, key, value);
if (key) { if (key) {
env->DeleteLocalRef(key); env->DeleteLocalRef(key);
} }
...@@ -78,7 +78,7 @@ void AndroidGameHost::runWindbot(JNIEnv *env, const char* _cmd) { ...@@ -78,7 +78,7 @@ void AndroidGameHost::runWindbot(JNIEnv *env, const char* _cmd) {
return; return;
} }
jstring cmd = env->NewStringUTF(_cmd); jstring cmd = env->NewStringUTF(_cmd);
env->CallVoidMethod(host, java_runWindbot, cmd); env->CallVoidMethod(app->activity->clazz, java_runWindbot, cmd);
if (cmd) { if (cmd) {
env->DeleteLocalRef(cmd); env->DeleteLocalRef(cmd);
} }
...@@ -90,7 +90,7 @@ void AndroidGameHost::saveSetting(JNIEnv *env, const char *_key, const char *_va ...@@ -90,7 +90,7 @@ void AndroidGameHost::saveSetting(JNIEnv *env, const char *_key, const char *_va
} }
jstring key = env->NewStringUTF(_key); jstring key = env->NewStringUTF(_key);
jstring value = env->NewStringUTF(_value); jstring value = env->NewStringUTF(_value);
env->CallVoidMethod(host, java_saveSetting, key, value); env->CallVoidMethod(app->activity->clazz, java_saveSetting, key, value);
if (key) { if (key) {
env->DeleteLocalRef(key); env->DeleteLocalRef(key);
} }
...@@ -119,6 +119,6 @@ int AndroidGameHost::getLocalAddr(JNIEnv *env) { ...@@ -119,6 +119,6 @@ int AndroidGameHost::getLocalAddr(JNIEnv *env) {
if (!java_getLocalAddr) { if (!java_getLocalAddr) {
return 0; return 0;
} }
return env->CallIntMethod(host, java_getLocalAddr); return env->CallIntMethod(app->activity->clazz, java_getLocalAddr);
} }
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
namespace ygo { namespace ygo {
class AndroidGameHost { class AndroidGameHost {
private: private:
jobject host;
jmethodID java_getSetting; jmethodID java_getSetting;
jmethodID java_getIntSetting; jmethodID java_getIntSetting;
jmethodID java_saveIntSetting; jmethodID java_saveIntSetting;
...@@ -22,7 +21,7 @@ namespace ygo { ...@@ -22,7 +21,7 @@ namespace ygo {
ANDROID_APP app; ANDROID_APP app;
public: public:
AndroidGameHost(ANDROID_APP app, jobject host); AndroidGameHost(ANDROID_APP app);
//! destructor //! destructor
virtual ~AndroidGameHost(); virtual ~AndroidGameHost();
......
...@@ -6,18 +6,18 @@ ...@@ -6,18 +6,18 @@
using namespace ygo; using namespace ygo;
AndroidGameUI::AndroidGameUI(ANDROID_APP _app, jobject _host) { AndroidGameUI::AndroidGameUI(ANDROID_APP _app) {
host = _host;
app = _app; app = _app;
} }
AndroidGameUI::~AndroidGameUI() { AndroidGameUI::~AndroidGameUI() {
JNIEnv *env = irr::android::getJniEnv(app); app = NULL;
env->DeleteGlobalRef(host); //JNIEnv *env = irr::android::getJniEnv(app);
//env->DeleteGlobalRef(app->activity->clazz);
} }
void AndroidGameUI::initMethods(JNIEnv *env) { void AndroidGameUI::initMethods(JNIEnv *env) {
jclass clazz = env->GetObjectClass(host); jclass clazz = env->GetObjectClass(app->activity->clazz);
java_toggleIME = env->GetMethodID(clazz, "toggleIME", "(ZLjava/lang/String;)V"); java_toggleIME = env->GetMethodID(clazz, "toggleIME", "(ZLjava/lang/String;)V");
java_performHapticFeedback = env->GetMethodID(clazz, "performHapticFeedback", "()V"); java_performHapticFeedback = env->GetMethodID(clazz, "performHapticFeedback", "()V");
java_showComboBoxCompat = env->GetMethodID(clazz, "showComboBoxCompat", java_showComboBoxCompat = env->GetMethodID(clazz, "showComboBoxCompat",
...@@ -38,7 +38,7 @@ void AndroidGameUI::toggleIME(JNIEnv *env, bool show, const char *_msg) { ...@@ -38,7 +38,7 @@ void AndroidGameUI::toggleIME(JNIEnv *env, bool show, const char *_msg) {
return; return;
} }
jstring msg = env->NewStringUTF(_msg); jstring msg = env->NewStringUTF(_msg);
env->CallVoidMethod(host, java_toggleIME, (jboolean) show, msg); env->CallVoidMethod(app->activity->clazz, java_toggleIME, (jboolean) show, msg);
if (msg) { if (msg) {
env->DeleteLocalRef(msg); env->DeleteLocalRef(msg);
} }
...@@ -48,7 +48,7 @@ void AndroidGameUI::performHapticFeedback(JNIEnv *env) { ...@@ -48,7 +48,7 @@ void AndroidGameUI::performHapticFeedback(JNIEnv *env) {
if (!java_performHapticFeedback) { if (!java_performHapticFeedback) {
return; return;
} }
env->CallVoidMethod(host, java_performHapticFeedback); env->CallVoidMethod(app->activity->clazz, java_performHapticFeedback);
} }
void void
...@@ -64,7 +64,7 @@ AndroidGameUI::showAndroidComboBoxCompat(JNIEnv *env, bool pShow, char **pConten ...@@ -64,7 +64,7 @@ AndroidGameUI::showAndroidComboBoxCompat(JNIEnv *env, bool pShow, char **pConten
str = env->NewStringUTF(*(pContents + i)); str = env->NewStringUTF(*(pContents + i));
env->SetObjectArrayElement(array, i, str); env->SetObjectArrayElement(array, i, str);
} }
env->CallVoidMethod(host, java_showComboBoxCompat, array, (jboolean) pShow, env->CallVoidMethod(app->activity->clazz, java_showComboBoxCompat, array, (jboolean) pShow,
(jint) mode); (jint) mode);
} }
...@@ -73,21 +73,21 @@ int AndroidGameUI::getWindowWidth(JNIEnv *env) { ...@@ -73,21 +73,21 @@ int AndroidGameUI::getWindowWidth(JNIEnv *env) {
if (!java_getWindowWidth) { if (!java_getWindowWidth) {
return 0; return 0;
} }
return env->CallIntMethod(host, java_getWindowWidth); return env->CallIntMethod(app->activity->clazz, java_getWindowWidth);
} }
int AndroidGameUI::getWindowHeight(JNIEnv *env) { int AndroidGameUI::getWindowHeight(JNIEnv *env) {
if (!java_getWindowHeight) { if (!java_getWindowHeight) {
return 0; return 0;
} }
return env->CallIntMethod(host, java_getWindowHeight); return env->CallIntMethod(app->activity->clazz, java_getWindowHeight);
} }
irr::android::InitOptions* AndroidGameUI::getInitOptions(JNIEnv *env) { irr::android::InitOptions* AndroidGameUI::getInitOptions(JNIEnv *env) {
if (!java_getInitOptions) { if (!java_getInitOptions) {
return nullptr; return nullptr;
} }
jobject buffer = env->CallObjectMethod(host, java_getInitOptions); jobject buffer = env->CallObjectMethod(app->activity->clazz, java_getInitOptions);
if(buffer) { if(buffer) {
void *data = env->GetDirectBufferAddress(buffer); void *data = env->GetDirectBufferAddress(buffer);
return new irr::android::InitOptions(data); return new irr::android::InitOptions(data);
...@@ -100,7 +100,7 @@ irr::android::YGOGameOptions* AndroidGameUI::getJoinOptions(JNIEnv *env) { ...@@ -100,7 +100,7 @@ irr::android::YGOGameOptions* AndroidGameUI::getJoinOptions(JNIEnv *env) {
if (!java_getJoinOptions) { if (!java_getJoinOptions) {
return nullptr; return nullptr;
} }
jobject buffer = env->CallObjectMethod(host, java_getJoinOptions); jobject buffer = env->CallObjectMethod(app->activity->clazz, java_getJoinOptions);
if(buffer) { if(buffer) {
void *data = env->GetDirectBufferAddress(buffer); void *data = env->GetDirectBufferAddress(buffer);
return new irr::android::YGOGameOptions(data); return new irr::android::YGOGameOptions(data);
...@@ -116,21 +116,21 @@ void AndroidGameUI::attachNativeDevice(JNIEnv*env, void* device){ ...@@ -116,21 +116,21 @@ void AndroidGameUI::attachNativeDevice(JNIEnv*env, void* device){
} }
jint value = (int)device; jint value = (int)device;
LOGI("attachNativeDevice %d", value); LOGI("attachNativeDevice %d", value);
env->CallVoidMethod(host, java_attachNativeDevice, value); env->CallVoidMethod(app->activity->clazz, java_attachNativeDevice, value);
} }
int AndroidGameUI::getWindowLeft(JNIEnv *env) { int AndroidGameUI::getWindowLeft(JNIEnv *env) {
if (!java_getWindowLeft) { if (!java_getWindowLeft) {
return 0; return 0;
} }
return env->CallIntMethod(host, java_getWindowLeft); return env->CallIntMethod(app->activity->clazz, java_getWindowLeft);
} }
int AndroidGameUI::getWindowTop(JNIEnv *env) { int AndroidGameUI::getWindowTop(JNIEnv *env) {
if (!java_getWindowTop) { if (!java_getWindowTop) {
return 0; return 0;
} }
return env->CallIntMethod(host, java_getWindowTop); return env->CallIntMethod(app->activity->clazz, java_getWindowTop);
} }
void AndroidGameUI::playSoundEffect(JNIEnv *env, const char *_name) { void AndroidGameUI::playSoundEffect(JNIEnv *env, const char *_name) {
...@@ -138,7 +138,7 @@ void AndroidGameUI::playSoundEffect(JNIEnv *env, const char *_name) { ...@@ -138,7 +138,7 @@ void AndroidGameUI::playSoundEffect(JNIEnv *env, const char *_name) {
return; return;
} }
jstring name = env->NewStringUTF(_name); jstring name = env->NewStringUTF(_name);
env->CallVoidMethod(host, java_playSoundEffect, name); env->CallVoidMethod(app->activity->clazz, java_playSoundEffect, name);
if (name) { if (name) {
env->DeleteLocalRef(name); env->DeleteLocalRef(name);
} }
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
namespace ygo { namespace ygo {
class AndroidGameUI { class AndroidGameUI {
private: private:
jobject host;
jmethodID java_toggleIME; jmethodID java_toggleIME;
jmethodID java_performHapticFeedback; jmethodID java_performHapticFeedback;
jmethodID java_showComboBoxCompat; jmethodID java_showComboBoxCompat;
...@@ -29,7 +28,7 @@ namespace ygo { ...@@ -29,7 +28,7 @@ namespace ygo {
ANDROID_APP app; ANDROID_APP app;
public: public:
AndroidGameUI(ANDROID_APP app, jobject obj); AndroidGameUI(ANDROID_APP app);
//! destructor //! destructor
virtual ~AndroidGameUI(); virtual ~AndroidGameUI();
......
...@@ -13,23 +13,14 @@ import cn.garymb.ygomobile.tool.GameSoundPlayer; ...@@ -13,23 +13,14 @@ import cn.garymb.ygomobile.tool.GameSoundPlayer;
import cn.garymb.ygomobile.tool.NetworkController; import cn.garymb.ygomobile.tool.NetworkController;
@Keep @Keep
public abstract class GameHost { public abstract class GameHost implements IGameHost{
private final NetworkController mNetworkController; private final NetworkController mNetworkController;
public GameHost(Context context) { public GameHost(Context context) {
mNetworkController = new NetworkController(context); mNetworkController = new NetworkController(context);
} }
public abstract String getSetting(String key); @Override
public abstract int getIntSetting(String key, int def);
public abstract void saveIntSetting(String key, int value);
public abstract void saveSetting(String key, String value);
public abstract void runWindbot(String cmd);
public int getLocalAddr() { public int getLocalAddr() {
return mNetworkController.getIPAddress(); return mNetworkController.getIPAddress();
} }
......
...@@ -4,7 +4,5 @@ package cn.garymb.ygomobile.interfaces; ...@@ -4,7 +4,5 @@ package cn.garymb.ygomobile.interfaces;
import androidx.annotation.Keep; import androidx.annotation.Keep;
@Keep @Keep
public interface IGameActivity { public interface IGameActivity extends IGameUI, IGameHost{
GameHost getNativeGameHost();
IGameUI getNativeGameUI();
} }
package cn.garymb.ygomobile.interfaces;
public interface IGameHost {
String getSetting(String key);
int getIntSetting(String key, int def);
void saveIntSetting(String key, int value);
void saveSetting(String key, String value);
void runWindbot(String cmd);
int getLocalAddr();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment