zoukankan      html  css  js  c++  java
  • cocos2d-x之jni使用(对接Android各种sdk)

    游戏弄完了,要发布到各个平台,ios、Android是肯定少不了的,那么本文就来讲讲Android平台对接代理商付费sdk、各渠道、五大运营商、广告、分享、数据统计等等少不了的jni调用,接sdk真是各种麻烦事儿啊。。。

    首先,这么多sdk,功能各有不同,所以得有一个统一的sdk管理类来管理,然后游戏中需要用到什么功能的时候调用指定接口,接口实现时,不同的平台在调用不用的sdk~

    然后,c++调用java层:(拿显示广告来举例)

    //====================================
    // c++
    //====================================
    //com/ican/redstar/ ---> 调用的类的路径(包名可以和绝对路径名不同)    
    //RedStarSDKManager ---> 类名
    //showYcAD   ---> 要调用的接口名
    //()V    ---> 返回值void  参数void
    #define CLASS_NAME "com/ican/redstar/RedStarSDKManager"
    
    #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
    	JniMethodInfo t;
    	if (JniHelper::getStaticMethodInfo(t,
    		CLASS_NAME,
    		"showYcAD",
    		"()V"))
    	{
    		t.env->CallStaticVoidMethod(t.classID, t.methodID);
    		t.env->DeleteLocalRef(t.classID);
    	}else
    	{
    		CCLog("C++ call java showYcAd faild!");
    	}
    #endif
    
    //========================================
    //java
    //========================================
    public static void showYcAD(){
    		Log.d("ycad", "call from cocos2d-x...");
    		
    		try{
    			YcCpManager.getInstance().showCp(getContext().getApplicationContext());
    		}catch(Exception e){
    			Log.d("ycad", "show cp thow uncaught exception");
    		}
    		
    	}
    

    没错,很简单~,当然,如果要传递参数,或者函数有返回值,会稍微变得复杂一些,最后来讨论,先看java层掉用c++

    //==============================
    //java
    //==============================
    //直接声明一个native方法就行了 ,比如用户登录返回
    //jni  callback
    private static native void loginEndCallBack(int loginSuccess, String useName);
    
    
    //==============================
    //c++
    //==============================
    //登录回调
    //com_ican_redstar_RedStarSDKManager ---> 路径、类名、函数名用下划线隔开
    //
    JNIEXPORT void JNICALL Java_com_ican_redstar_RedStarSDKManager_loginEndCallBack
    	(JNIEnv *env, jobject thiz, jint loginSuccess, jstring useName)
    {
    	jboolean jb_copy = false;
    	string nameStr = string(env->GetStringUTFChars(useName, &jb_copy));
    	int sec = loginSuccess;
    
    	CCLog("%s jni Called true  [login = %d, userName = %s]", __FUNCTION__, sec, nameStr.c_str());
    
    	RedStarSDKManager::getInstance()->loginCallBack(sec, nameStr);
    }
    

    好棒,java调c++也很简单。

    最后,我们来看看参数传递,与函数返回吧:

    借鉴一下其他朋友的博客吧,午休了~

    http://www.blogjava.net/china-qd/archive/2006/04/29/44002.html(详解了参数传递)

    http://blog.csdn.net/luxiaoyu_sdc/article/details/15874505(详解了cocos2d::JniHelper)

  • 相关阅读:
    ASP.NET中JSON的序列化和反序列化
    Git 本地项目上传至托管平台(OsChina/GitHub)
    Android Gradle 完整指南(转)
    开发错误记录13:java.lang.UnsatisfiedLinkError: Couldn't load xxx.so: findLibrary returned null
    Android其它新控件 (转)
    一个Activity掌握Design新控件 (转)
    一个Activity掌握Android5.0新控件 (转)
    一个Activity掌握Android4.0新控件 (转)
    开发错误日记 12: Unsupported major.minor version 52.0
    Linux 下各个目录的作用及内容
  • 原文地址:https://www.cnblogs.com/songcf/p/3799303.html
Copyright © 2011-2022 走看看