Skip to content

Commit

Permalink
适配android 2.0.5版本
Browse files Browse the repository at this point in the history
  • Loading branch information
U-UZ\litl authored and U-UZ\litl committed Feb 7, 2018
1 parent 18ace36 commit 7fcb279
Show file tree
Hide file tree
Showing 17 changed files with 186 additions and 117 deletions.
17 changes: 6 additions & 11 deletions Classes/C2DXMobLink/Android/C2DXAndroidActionListener.cpp
@@ -1,9 +1,4 @@
//
// Created by litl on 2017/5/18.
//

#include "C2DXAndroidActionListener.h"
#include "JSON/CCJSONConverter.h"

C2DXAndroidActionListener::C2DXAndroidActionListener()
{
Expand All @@ -17,19 +12,19 @@ void C2DXAndroidActionListener::setGetModIdCallBack(C2DXGetMobIdResultEvent cb)

void C2DXAndroidActionListener::onResult(const char* result)
{
CCJSONConverter* json = CCJSONConverter::sharedConverter();
C2DXDictionary* dic = json->dictionaryFrom(result);
CCString* modId = (CCString*) dic->objectForKey("mobID");
C2DXGetMobIdResultEvent prt = getModIdCallBack;
if (prt) {
prt(modId->getCString());
prt(result);
}
dic->release();
}

void C2DXAndroidActionListener::onError(const char* error)
{
// do nothing
// 临时解决mobid失败时, 传空字符串(与ios保持一致)
C2DXGetMobIdResultEvent prt = getModIdCallBack;
if (prt) {
prt("");
}
}

C2DXAndroidActionListener::~C2DXAndroidActionListener()
Expand Down
4 changes: 0 additions & 4 deletions Classes/C2DXMobLink/Android/C2DXAndroidActionListener.h
@@ -1,7 +1,3 @@
//
// Created by litl on 2017/5/18.
//

#ifndef __C2DXMobLinkSample__C2DXAndroidActionListener__
#define __C2DXMobLinkSample__C2DXAndroidActionListener__

Expand Down
76 changes: 45 additions & 31 deletions Classes/C2DXMobLink/Android/C2DXAndroidMobLink.cpp
@@ -1,44 +1,25 @@
//
// C2DXAndroidMobLink.m
// Cocos2DXForMobLink
//
// Created by 李同垒 on 2017/5/18.
//
//



#include "C2DXAndroidMobLink.h"
#include "JSON/CCJSONConverter.h"
#include "C2DXAndroidRestoreSceneListener.h"
#include "string.h"

USING_NS_CC;
using namespace mob::moblink;

void C2DXAndroidMobLink::getMobId(mob::moblink::C2DXMobLinkScene *scene, C2DXGetMobIdResultEvent callback)
{
JNIEnv* env = JniHelper::getEnv();
jstring jPath = env->NewStringUTF(scene->path.c_str());
jstring jSource = env->NewStringUTF(scene->source.c_str());

jobject jParam;
{
// 大括号, 隐藏不必要的变量
C2DXDictionary* dict = scene->getCustomParams();
CCJSONConverter* json = CCJSONConverter::sharedConverter();
const char* ccContent = json->strFrom(dict);
jParam = jsonString2HashMap(env, ccContent);
}
jobject jScene = cxxScene2JavaScene(scene, env);

JniMethodInfo mi;
JniHelper::getStaticMethodInfo(mi, "com/mob/moblink/MobLink"
, "getMobID", "(Ljava/util/HashMap;Ljava/lang/String;Ljava/lang/String;Lcom/mob/moblink/ActionListener;)V");
, "getMobID", "(Lcom/mob/moblink/Scene;Lcom/mob/moblink/ActionListener;)V");

jobject jListener = newActionListener(env);
C2DXAndroidActionListener* cxxListener = (C2DXAndroidActionListener*)getCxxObject(env, jListener);
cxxListener->setGetModIdCallBack(callback);

env->CallStaticVoidMethod(mi.classID, mi.methodID, jParam, jPath, jSource, jListener);
env->CallStaticVoidMethod(mi.classID, mi.methodID, jScene, jListener);
}

void C2DXAndroidMobLink::setRestoreCallBack(C2DXRestoreSceneResultEvent callback)
Expand All @@ -65,16 +46,49 @@ jobject C2DXAndroidMobLink::getAndroidContext(JNIEnv* env)
return env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID);
}

jobject C2DXAndroidMobLink::jsonString2HashMap(JNIEnv* env, const char* json)
jobject C2DXAndroidMobLink::cxxScene2JavaScene(C2DXMobLinkScene* scene, JNIEnv* env)
{
JniMethodInfo mi;
JniHelper::getMethodInfo(mi, "com/mob/tools/utils/Hashon", "<init>", "()V");
jobject jthiz = env->NewObject(mi.classID, mi.methodID);
jclass jclazz = env->FindClass("com/mob/moblink/Scene");
jmethodID jmethod = env->GetMethodID(jclazz, "<init>", "()V");
jobject jScene = env->NewObject(jclazz, jmethod);

jobject jTemp = env->NewStringUTF(scene->path.c_str());
jfieldID jField = env->GetFieldID(jclazz, "path", "Ljava/lang/String;");
env->SetObjectField(jScene, jField, jTemp);

jTemp = env->NewStringUTF(scene->source.c_str());
jField = env->GetFieldID(jclazz, "path", "Ljava/lang/String;");
env->SetObjectField(jScene, jField, jTemp);

jTemp = NULL;
C2DXDictionary* dict = scene->getCustomParams();
if (NULL != dict) {
jTemp = dict2HashMap(dict, env);
}
jField = env->GetFieldID(jclazz, "params", "Ljava/util/HashMap;");
env->SetObjectField(jScene, jField, jTemp);

jmethodID jmethod = env->GetMethodID(mi.classID, "fromJson", "(Ljava/lang/String;)Ljava/util/HashMap;");
jstring jJson = env->NewStringUTF(json);
jobject result = env->CallObjectMethod(jthiz, jmethod, jJson);
return result;
return jScene;
}

jobject C2DXAndroidMobLink::dict2HashMap(C2DXDictionary* dict, JNIEnv* env)
{
jclass jclazz = env->FindClass("java/util/HashMap");
jmethodID jMethod = env->GetMethodID(jclazz, "<init>", "()V");
jobject jHashMap = env->NewObject(jclazz, jMethod);
jMethod = env->GetMethodID(jclazz, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

C2DXArray* keys = dict->allKeys();
int size = NULL != keys ? keys->count() : 0;
for (int i = 0; i < size; ++i) {
CCString* key = dynamic_cast<CCString*>(keys->objectAtIndex(i));

jobject jKey = env->NewStringUTF(key->getCString());
jobject jValue = env->NewStringUTF(dict->valueForKey(key->getCString())->getCString());

env->CallObjectMethod(jHashMap, jMethod, jKey, jValue);
}
return jHashMap;
}

jobject C2DXAndroidMobLink::newActionListener(JNIEnv* env)
Expand Down
3 changes: 2 additions & 1 deletion Classes/C2DXMobLink/Android/C2DXAndroidMobLink.h
Expand Up @@ -34,7 +34,8 @@ namespace mob

private:
static jobject getAndroidContext(JNIEnv* env);
static jobject jsonString2HashMap(JNIEnv* env, const char* json);
static jobject cxxScene2JavaScene(C2DXMobLinkScene* scene, JNIEnv* env);
static jobject dict2HashMap(C2DXDictionary* dict, JNIEnv* env);
static jobject newActionListener(JNIEnv* env);
};

Expand Down
78 changes: 54 additions & 24 deletions Classes/C2DXMobLink/Android/C2DXAndroidRestoreSceneListener.cpp
@@ -1,9 +1,4 @@
//
// Created by litl on 2017/5/18.
//

#include "C2DXAndroidRestoreSceneListener.h"
#include "JSON/CCJSONConverter.h"

extern mob::moblink::C2DXRestoreSceneResultEvent restoreSceneCallBack;

Expand All @@ -17,37 +12,72 @@ void C2DXAndroidRestoreSceneListener::setRestoreSceneCallBack(C2DXRestoreSceneRe
restoreSceneCallBack = cb;
}

void C2DXAndroidRestoreSceneListener::onReturnSceneData(const char* result)
void C2DXAndroidRestoreSceneListener::onReturnSceneData(JNIEnv* env, jobject jScene)
{
CCJSONConverter *json = CCJSONConverter::sharedConverter();
C2DXDictionary *dic = json->dictionaryFrom(result);
__String* path = (__String*)dic->objectForKey("path");
__String* source = (__String*)dic->objectForKey("source");
C2DXDictionary* params = (C2DXDictionary*)dic->objectForKey("params");

C2DXMobLinkScene* scene = new C2DXMobLinkScene();
if (path)
{
scene->path = path->getCString();
jclass jclazz = env->GetObjectClass(jScene);

jfieldID jField = env->GetFieldID(jclazz, "path", "Ljava/lang/String;");
jobject jTemp = env->GetObjectField(jScene, jField);
const char* cvalue = env->GetStringUTFChars((jstring)jTemp, NULL);
if (NULL != cvalue) {
scene->path = cvalue;
env->ReleaseStringUTFChars((jstring )jTemp, cvalue);
}

if (source)
{
scene->source = source->getCString();
jField = env->GetFieldID(jclazz, "source", "Ljava/lang/String;");
jTemp = env->GetObjectField(jScene, jField);
cvalue = env->GetStringUTFChars((jstring)jTemp, NULL);
if (NULL != cvalue) {
scene->source = cvalue;
env->ReleaseStringUTFChars((jstring )jTemp, cvalue);
}

if (params)
{
scene->setCustomParams(params);
// TODO
jField = env->GetFieldID(jclazz, "params", "Ljava/util/HashMap;");
jTemp = env->GetObjectField(jScene, jField);
C2DXDictionary* dict = hashMap2Dict(env, jTemp);
if (NULL != dict) {
scene->setCustomParams(dict);
dict->release();
}

C2DXRestoreSceneResultEvent prt = restoreSceneCallBack;
if (prt)
{
if (prt) {
prt(scene);
}
}

dic->release();
C2DXDictionary* C2DXAndroidRestoreSceneListener::hashMap2Dict(JNIEnv* env, jobject jHashMap)
{
C2DXDictionary* dict = C2DXDictionary::create();

jclass jclazz = env->FindClass("com/mob/moblink/cocos2dx/MapUtil");
jmethodID jMethod = env->GetStaticMethodID(jclazz, "keySet", "(Ljava/util/Map;)[Ljava/lang/Object;");
jobject jKeys = env->CallStaticObjectMethod(jclazz, jMethod, jHashMap);
jsize count = env->GetArrayLength((jarray)jKeys);


jclazz = env->GetObjectClass(jHashMap);
jMethod = env->GetMethodID(jclazz, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
for (int i = 0; i < count; ++i) {
jobject jKey = env->GetObjectArrayElement((jobjectArray)jKeys, i);
jobject jValue = env->CallObjectMethod(jHashMap, jMethod, jKey);
const char * cKey = env->GetStringUTFChars((jstring)jKey, NULL);
const char * cValue = env->GetStringUTFChars((jstring)jValue, NULL);
if (NULL != cKey && NULL != cValue) {
dict->setObject(C2DXString::create(cValue), cKey);
}
if (NULL != cKey) {
env->ReleaseStringUTFChars((jstring)jKey, cKey);
}
if (NULL != cValue) {
env->ReleaseStringUTFChars((jstring)jValue, cValue);
}
env->DeleteLocalRef(jKey);
env->DeleteLocalRef(jValue);
}
return dict;
}

C2DXRestoreSceneResultEvent C2DXAndroidRestoreSceneListener::getRestoreSceneCallBack()
Expand Down
Expand Up @@ -24,7 +24,7 @@ class C2DXAndroidRestoreSceneListener {
* 当时有场景还原时回调
* @param result json字符串
*/
void onReturnSceneData(const char* result);
void onReturnSceneData(JNIEnv* env, jobject scene);

/**
* 设置场景还原的回调函数
Expand All @@ -38,6 +38,9 @@ class C2DXAndroidRestoreSceneListener {
*/
C2DXRestoreSceneResultEvent getRestoreSceneCallBack();

private:
static C2DXDictionary* hashMap2Dict(JNIEnv* env, jobject jHashMap);

};

#endif
Expand Up @@ -30,6 +30,7 @@ JNIEXPORT jint JNICALL Java_com_mob_moblink_cocos2dx_ActionListener_nativeOnResu
const char* cresult = env->GetStringUTFChars(jresult, JNI_FALSE);
listener->onResult(cresult);
env->ReleaseStringUTFChars(jresult, cresult);
return 0;
}

/*
Expand All @@ -44,7 +45,7 @@ JNIEXPORT jint JNICALL Java_com_mob_moblink_cocos2dx_ActionListener_nativeOnErro
const char* cresult = env->GetStringUTFChars(jerror, JNI_FALSE);
listener->onError(cresult);
env->ReleaseStringUTFChars(jerror, cresult);

return 0;
}

/*
Expand All @@ -57,4 +58,5 @@ JNIEXPORT jint JNICALL Java_com_mob_moblink_cocos2dx_ActionListener_nativeOnDest
{
C2DXAndroidActionListener* listener = (C2DXAndroidActionListener*)getCxxObject(env, jthiz);
delete listener;
return 0;
}
Expand Up @@ -20,15 +20,14 @@ JNIEXPORT jint JNICALL Java_com_mob_moblink_cocos2dx_RestoreSceneListener_native
/*
* Class: com_mob_moblink_cocos2dx_RestoreSceneListener
* Method: nativeOnReturnSceneData
* Signature: (Landroid/app/Activity;Ljava/lang/String;)I
* Signature: (Landroid/app/Activity;Lcom/mob/moblink/Scene;)I
*/
JNIEXPORT jint JNICALL Java_com_mob_moblink_cocos2dx_RestoreSceneListener_nativeOnReturnSceneData
(JNIEnv *env, jobject jthiz, jobject jactivity, jstring jvalue)
(JNIEnv *env, jobject jthiz, jobject jactivity, jobject jvalue)
{
C2DXAndroidRestoreSceneListener* listener = (C2DXAndroidRestoreSceneListener*)getCxxObject(env, jthiz);
const char* cvalue = env->GetStringUTFChars(jvalue, JNI_FALSE);
listener->onReturnSceneData(cvalue);
env->ReleaseStringUTFChars(jvalue, cvalue);
listener->onReturnSceneData(env, jvalue);
return 0;
}

/*
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 8 additions & 5 deletions proj.android-studio/Cocos2dxBridge/build.gradle
@@ -1,8 +1,6 @@
import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.library'
apply from: '../MobLink/build-mix.gradle'

apply from: './build-mix.gradle'
apply plugin: 'com.mob.sdk'

android {

Expand Down Expand Up @@ -56,5 +54,10 @@ android {

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile project(':MobLink')
}

MobSDK {
MobCommons {}
MobTools {}
MobLink {version = "2.0.5"}
}
4 changes: 1 addition & 3 deletions proj.android-studio/Cocos2dxBridge/jni/Android.mk
Expand Up @@ -18,9 +18,7 @@ LOCAL_SRC_FILES := ../../../Classes/C2DXMobLink/C2DXMobLink.cpp \
../../../Classes/C2DXMobLink/Android/C2DXAndroidActionListener.cpp \
../../../Classes/C2DXMobLink/Android/com_mob_moblink_cocos2dx_ActionListener.cpp \
../../../Classes/C2DXMobLink/Android/C2DXAndroidRestoreSceneListener.cpp \
../../../Classes/C2DXMobLink/Android/com_mob_moblink_cocos2dx_RestoreSceneListener.cpp \
../../../Classes/C2DXMobLink/Android/JSON/CCJSONConverter.cpp \
../../../Classes/C2DXMobLink/Android/JSON/cJSON/cJSON.c
../../../Classes/C2DXMobLink/Android/com_mob_moblink_cocos2dx_RestoreSceneListener.cpp


LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(COCOS2D_ROOT)/cocos \
Expand Down

0 comments on commit 7fcb279

Please sign in to comment.