2015-08-25 29 views
0

我使用Android代码调用cocos2dx遇到了一个问题。我不会在Android的cocos2dx上下文中调用,我不确定下面的代码是否有问题,然后我需要在Android中调用以下方法,以及发生这种调用的错误。Android Cocos2d-x 3.7:如何在cocos2d-x中获得应用程序上下文?

void AdmasterConvSDK::AdMasterInitial(std::string appId) 
{ 

    JniMethodInfo methodInfo; 
    if (JniHelper::getStaticMethodInfo(methodInfo, "com/admaster/square/api/ConvMobiSDK", "initial", 
             "(Landroid/content/Context;Ljava/lang/String;)V")) { 
     jstring appID = methodInfo.env->NewStringUTF(appId.c_str()); 

     jclass cl = methodInfo.env->FindClass("org/cocos2dx/lib/Cocos2dxActivity"); 
     jmethodID methodContext = methodInfo.env->GetStaticMethodID(cl,"getContext","()Landroid/content/Context"); 
     jobject context = methodInfo.env->CallStaticObjectMethod(cl,methodContext); 
     methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID,context,appID); 

    } else { 
     log("ERROR"); 
    } 

} 

的Android代码:

public static void initial(Context context, String m2id) { 
    ConvMobiInstance adjustInstance = ConvMobiSDK.getDefaultInstance(); 
    adjustInstance.initial(context, m2id); 
} 

错误:

08-31 17:03:07.083: A/libc(22452): Fatal signal 11 (SIGSEGV) at 0x0000001c (code=1), thread 22470 (Thread-38567)

已经研究了很长一段时间,我希望能有出现,以帮助回答这个问题,在此先感谢。

回答

0
你的C++代码在glThread错误Java代码运行

需要在uiThread运行,因此,如果调用由C++ Java方法,你需要让你在UI线程Java代码运行, 改变你的Java代码:

public static void initial(final Context context, final String m2id) { 
    ((Activity)context).runOnUiThread(new Thread(){ 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      super.run(); 
      ConvMobiInstance adjustInstance = ConvMobiSDK.getDefaultInstance(); 
      adjustInstance.initial(context, m2id); 
     } 
    }); 
} 
0

如果该功能的初始()是一些初始化只,然后不从C调用它++,而不是从Cocos2dxActivity.java 调用它内部的init()/的onCreate()这样

ClassName.initial功能(这个,“string_id”);

第一个参数将为您提供应用程序上下文,您可以为其分配一些类变量并稍后使用它。

//示例类

公共类AdHelper {

private static Context m_context; 

/* 
call this function from Cocos2dxActivity.java 
AdsHelper.init(this); 
*/ 
public static void initAds(Context context) 
{ 
    m_context = context; 
} 

/* 
call this from C++ from through JNI 
*/ 
public static void showAds() 
{ 
    ((Activity)m_context).runOnUiThread(new Thread(){ 
     @Override 
     public void run() { 

      super.run(); 
      Adservice adService = Adservice.getDefaultInstance(); 
      adService.showAds(m_context); 
     } 
    }); 

} 

}