fixed #2155 : Resolve the bug of callback methods in plugin.

This commit is contained in:
zhangbin 2013-05-16 11:45:46 +08:00
parent 5a9db1a8da
commit 79bd3c990e
8 changed files with 35 additions and 23 deletions

View File

@ -119,10 +119,10 @@ JNIEnv* PluginUtils::getEnv()
} }
std::map<PluginProtocol*, PluginJavaData*> s_PluginObjMap; std::map<PluginProtocol*, PluginJavaData*> s_PluginObjMap;
std::map<jobject, PluginProtocol*> s_JObjPluginMap; std::map<std::string, PluginProtocol*> s_JObjPluginMap;
typedef std::map<PluginProtocol*, PluginJavaData*>::iterator ObjMapIter; typedef std::map<PluginProtocol*, PluginJavaData*>::iterator ObjMapIter;
typedef std::map<jobject, PluginProtocol*>::iterator JObjPluginMapIter; typedef std::map<std::string, PluginProtocol*>::iterator JObjPluginMapIter;
PluginJavaData* PluginUtils::getPluginJavaData(PluginProtocol* pKeyObj) PluginJavaData* PluginUtils::getPluginJavaData(PluginProtocol* pKeyObj)
{ {
@ -135,10 +135,10 @@ PluginJavaData* PluginUtils::getPluginJavaData(PluginProtocol* pKeyObj)
return ret; return ret;
} }
PluginProtocol* PluginUtils::getPluginPtr(jobject jobj) PluginProtocol* PluginUtils::getPluginPtr(std::string className)
{ {
PluginProtocol* ret = NULL; PluginProtocol* ret = NULL;
JObjPluginMapIter it = s_JObjPluginMap.find(jobj); JObjPluginMapIter it = s_JObjPluginMap.find(className);
if (it != s_JObjPluginMap.end()) { if (it != s_JObjPluginMap.end()) {
ret = it->second; ret = it->second;
} }
@ -150,7 +150,7 @@ void PluginUtils::setPluginJavaData(PluginProtocol* pKeyObj, PluginJavaData* pDa
{ {
erasePluginJavaData(pKeyObj); erasePluginJavaData(pKeyObj);
s_PluginObjMap.insert(std::pair<PluginProtocol*, PluginJavaData*>(pKeyObj, pData)); s_PluginObjMap.insert(std::pair<PluginProtocol*, PluginJavaData*>(pKeyObj, pData));
s_JObjPluginMap.insert(std::pair<jobject, PluginProtocol*>(pData->jobj, pKeyObj)); s_JObjPluginMap.insert(std::pair<std::string, PluginProtocol*>(pData->jclassName, pKeyObj));
} }
void PluginUtils::erasePluginJavaData(PluginProtocol* pKeyObj) void PluginUtils::erasePluginJavaData(PluginProtocol* pKeyObj)
@ -162,7 +162,7 @@ void PluginUtils::erasePluginJavaData(PluginProtocol* pKeyObj)
{ {
jobject jobj = pData->jobj; jobject jobj = pData->jobj;
JObjPluginMapIter pluginIt = s_JObjPluginMap.find(jobj); JObjPluginMapIter pluginIt = s_JObjPluginMap.find(pData->jclassName);
if (pluginIt != s_JObjPluginMap.end()) if (pluginIt != s_JObjPluginMap.end())
{ {
s_JObjPluginMap.erase(pluginIt); s_JObjPluginMap.erase(pluginIt);

View File

@ -46,7 +46,7 @@ public:
static void setPluginJavaData(PluginProtocol* pKeyObj, PluginJavaData* pData); static void setPluginJavaData(PluginProtocol* pKeyObj, PluginJavaData* pData);
static void erasePluginJavaData(PluginProtocol* pKeyObj); static void erasePluginJavaData(PluginProtocol* pKeyObj);
static PluginProtocol* getPluginPtr(jobject jobj); static PluginProtocol* getPluginPtr(std::string className);
template <typename T> template <typename T>
static void callJavaFunctionWithName_oneBaseType(PluginProtocol* thiz, const char* funcName, const char* paramCode, T param) static void callJavaFunctionWithName_oneBaseType(PluginProtocol* thiz, const char* funcName, const char* paramCode, T param)

View File

@ -37,9 +37,10 @@ THE SOFTWARE.
namespace cocos2d { namespace plugin { namespace cocos2d { namespace plugin {
extern "C" { extern "C" {
JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_InterfaceAds_nativeOnAdsResult(JNIEnv* env, jobject thiz, jobject obj, jint ret, jstring msg) { JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_InterfaceAds_nativeOnAdsResult(JNIEnv* env, jobject thiz, jstring className, jint ret, jstring msg) {
std::string strMsg = PluginJniHelper::jstring2string(msg); std::string strMsg = PluginJniHelper::jstring2string(msg);
PluginProtocol* pPlugin = PluginUtils::getPluginPtr(obj); std::string strClassName = PluginJniHelper::jstring2string(className);
PluginProtocol* pPlugin = PluginUtils::getPluginPtr(strClassName);
LOGD("nativeOnAdsResult(), Get plugin ptr : %p", pPlugin); LOGD("nativeOnAdsResult(), Get plugin ptr : %p", pPlugin);
if (pPlugin != NULL) if (pPlugin != NULL)
{ {
@ -52,8 +53,9 @@ extern "C" {
} }
} }
JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_InterfaceAds_nativeOnPlayerGetPoints(JNIEnv* env, jobject thiz, jobject obj, jint points) { JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_InterfaceAds_nativeOnPlayerGetPoints(JNIEnv* env, jobject thiz, jstring className, jint points) {
PluginProtocol* pPlugin = PluginUtils::getPluginPtr(obj); std::string strClassName = PluginJniHelper::jstring2string(className);
PluginProtocol* pPlugin = PluginUtils::getPluginPtr(strClassName);
LOGD("nativeOnPlayerGetPoints(), Get plugin ptr : %p", pPlugin); LOGD("nativeOnPlayerGetPoints(), Get plugin ptr : %p", pPlugin);
if (pPlugin != NULL) if (pPlugin != NULL)
{ {

View File

@ -37,10 +37,11 @@ THE SOFTWARE.
namespace cocos2d { namespace plugin { namespace cocos2d { namespace plugin {
extern "C" { extern "C" {
JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_InterfaceIAP_nativeOnPayResult(JNIEnv* env, jobject thiz, jobject obj, jint ret, jstring msg) JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_InterfaceIAP_nativeOnPayResult(JNIEnv* env, jobject thiz, jstring className, jint ret, jstring msg)
{ {
std::string strMsg = PluginJniHelper::jstring2string(msg); std::string strMsg = PluginJniHelper::jstring2string(msg);
PluginProtocol* pPlugin = PluginUtils::getPluginPtr(obj); std::string strClassName = PluginJniHelper::jstring2string(className);
PluginProtocol* pPlugin = PluginUtils::getPluginPtr(strClassName);
LOGD("nativeOnPayResult(), Get plugin ptr : %p", pPlugin); LOGD("nativeOnPayResult(), Get plugin ptr : %p", pPlugin);
if (pPlugin != NULL) if (pPlugin != NULL)
{ {

View File

@ -37,10 +37,11 @@ THE SOFTWARE.
namespace cocos2d { namespace plugin { namespace cocos2d { namespace plugin {
extern "C" { extern "C" {
JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_InterfaceSocial_nativeOnShareResult(JNIEnv* env, jobject thiz, jobject obj, jint ret, jstring msg) JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_InterfaceSocial_nativeOnShareResult(JNIEnv* env, jobject thiz, jstring className, jint ret, jstring msg)
{ {
std::string strMsg = PluginJniHelper::jstring2string(msg); std::string strMsg = PluginJniHelper::jstring2string(msg);
PluginProtocol* pPlugin = PluginUtils::getPluginPtr(obj); std::string strClassName = PluginJniHelper::jstring2string(className);
PluginProtocol* pPlugin = PluginUtils::getPluginPtr(strClassName);
LOGD("nativeOnShareResult(), Get plugin ptr : %p", pPlugin); LOGD("nativeOnShareResult(), Get plugin ptr : %p", pPlugin);
if (pPlugin != NULL) if (pPlugin != NULL)
{ {

View File

@ -101,11 +101,13 @@ public class InterfaceAds {
PluginWrapper.runOnGLThread(new Runnable(){ PluginWrapper.runOnGLThread(new Runnable(){
@Override @Override
public void run() { public void run() {
InterfaceAds.nativeOnAdsResult(curObj, curCode, curMsg); String name = curObj.getClass().getName();
name = name.replace('.', '/');
InterfaceAds.nativeOnAdsResult(name, curCode, curMsg);
} }
}); });
} }
private native static void nativeOnAdsResult(Object obj, int code, String msg); private native static void nativeOnAdsResult(String className, int code, String msg);
public static void onPlayerGetPoints(AdsAdapter adapter, int points) { public static void onPlayerGetPoints(AdsAdapter adapter, int points) {
final int curPoints = points; final int curPoints = points;
@ -113,9 +115,11 @@ public class InterfaceAds {
PluginWrapper.runOnGLThread(new Runnable(){ PluginWrapper.runOnGLThread(new Runnable(){
@Override @Override
public void run() { public void run() {
InterfaceAds.nativeOnPlayerGetPoints(curAdapter, curPoints); String name = curAdapter.getClass().getName();
name = name.replace('.', '/');
InterfaceAds.nativeOnPlayerGetPoints(name, curPoints);
} }
}); });
} }
private native static void nativeOnPlayerGetPoints(Object obj, int points); private native static void nativeOnPlayerGetPoints(String className, int points);
} }

View File

@ -45,9 +45,11 @@ public class InterfaceIAP {
PluginWrapper.runOnGLThread(new Runnable() { PluginWrapper.runOnGLThread(new Runnable() {
@Override @Override
public void run() { public void run() {
nativeOnPayResult(curObj, curRet, curMsg); String name = curObj.getClass().getName();
name = name.replace('.', '/');
nativeOnPayResult(name, curRet, curMsg);
} }
}); });
} }
private static native void nativeOnPayResult(Object obj, int ret, String msg); private static native void nativeOnPayResult(String className, int ret, String msg);
} }

View File

@ -45,9 +45,11 @@ public class InterfaceSocial {
PluginWrapper.runOnGLThread(new Runnable() { PluginWrapper.runOnGLThread(new Runnable() {
@Override @Override
public void run() { public void run() {
nativeOnShareResult(curAdapter, curRet, curMsg); String name = curAdapter.getClass().getName();
name = name.replace('.', '/');
nativeOnShareResult(name, curRet, curMsg);
} }
}); });
} }
private static native void nativeOnShareResult(Object obj, int ret, String msg); private static native void nativeOnShareResult(String className, int ret, String msg);
} }