android jni 移动妹妹计费 cocos2dx

本文详细介绍如何将Cocos2d-x游戏与中国移动的计费系统进行集成,包括创建Java包装类来适配移动计费SDK,设置JNI桥梁使C++与Java交互,以及在C++中实现必要的回调接口。
因为网上一堆坑爹的例子,让我崩溃,我不知道这些牛比的程序猿贴那些代码的时候,是不是真的自己运行了,我拷贝了,就运行不了,在这里心里骂两句,算了,下面的代码是我血的教训。自己都测试通过。特意写出来。

            最近在搞搞cocos2dx,当项目需要接入中国移动妹妹的计费接口时,我盲目了,因为我也是刚使用cocos2d,刚接触了hellow,是一个初级菜鸟,但也没有办法,只好硬着头皮搞,最近被折磨了一周的时间,基本搞清楚,因为移动妹妹是java的接口,所以,我们使用的时候先用java写一个简单的包装类,把妹妹包起来。然后用java和c++之间的纽带,打通二者之间的调用关系。下面详细说说流程:

<1> 包装妹妹的java类的定义:


这个是c++和java交互的jni包装类.
package ysgame.zhtph.game;
import mm.purchasesdk.Purchase;
import android.content.Context;
public class CYsYdmmBs
{
 private final String TAG = "CYsYdmmBs";
 private static Purchase m_purchase;
 private Context         m_context;
 private CYsYdmmListener m_Listener;
 
 private static           CYsYdmmBs sc_mydb = new CYsYdmmBs();
 public  static Object    singleydmm(){ return sc_mydb; }      //这个接口很重要,看清楚了返回类型,不然你要苦比了。
 public  static CYsYdmmBs single()    { return sc_mydb; }
 
 public native void cconAfterApply();
 public native void cconAfterDownload();
 public native void cconBeforeApply();
 public native void cconBeforeDownload();
 public native void cconInitFinish(int code);
 public native void cconUnsubscribeFinish( int code );
 public native void cconBillingFinish( String strvv );
 private CYsYdmmBs()
 {
  
 }
 
 public void InitLister( Context pcon )
 {
  m_context      = pcon;
  m_purchase     = Purchase.getInstance();
  m_Listener     = new CYsYdmmListener( m_context );
 }
 
 //out interface
 public void setAppInfo( String strAppid, String strAppkey )
 {
  try
  {
   m_purchase.setAppInfo( strAppid, strAppkey );
  }
  catch (Exception e1)
  {
   e1.printStackTrace();
  }
  
  try
  {
   m_purchase.init(m_context, m_Listener);
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }  
 }
 public String order(String paycode,int paycount) {
  try
  {
   return m_purchase.order( m_context, paycode, paycount,m_Listener );
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
  return "";
 }
 public void testzht(int paycount) {
  try
  {
   cconInitFinish(213);
   cconUnsubscribeFinish(101);
   //cconBillingFinish( "dds434" );
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
 }

////////////////////////////////////////
这个是移动妹妹勾搭我的类,需要我服务了,会回调这里面的接口通知我,最终的服务器有c++完成
package ysgame.zhtph.game;
import java.util.HashMap;
import mm.purchasesdk.PurchaseCode;
import mm.purchasesdk.OnPurchaseListener;
import android.content.Context;
public class CYsYdmmListener implements OnPurchaseListener {
 private final String TAG = "CYsYdmmListener";
 private Context  m_context;
 
 public CYsYdmmListener(Context context) {
  this.m_context = context;
 }
 @Override
 public void onAfterApply() {
  CYsYdmmBs.single().cconAfterApply();
 }
 @Override
 public void onAfterDownload() {
  CYsYdmmBs.single().cconAfterDownload();
 }
 @Override
 public void onBeforeApply() {
  CYsYdmmBs.single().cconBeforeApply();
 }
 @Override
 public void onBeforeDownload() {
  CYsYdmmBs.single().cconBeforeDownload();
 }
 @Override
 public void onInitFinish(int code) {
  CYsYdmmBs.single().cconInitFinish( code );
 }
 @Override
 public void onBillingFinish( int code, HashMap arg1 )
 {  
  CYsYdmmBs.single().cconBillingFinish( result );
 }
 @Override
 public void onQueryFinish(int code, HashMap arg1) {
 }
 @Override
 public void onUnsubscribeFinish(int code) {
  CYsYdmmBs.single().cconUnsubscribeFinish( code );
 }
}
 //////////////////////////////////////////////////////////
<2>
      在c++里面 android 的初始化函数里面注册你的c++实现。

函数的位置。
proj.android\jni\hellocpp
jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
    JniHelper::setJavaVM(vm);
    CYsBsMg::single().reg_jnifun();    //这是我的注册函数
    return JNI_VERSION_1_4;


<3> c++的实现:

注意所有的函数都有两个默认的参数,不然,你又要苦比了。

void cconAfterApply( JNIEnv* env, jobject thiz )
{
 CCLog( "zhtlog:cconAfterApply() ok!" );
}
void cconAfterDownload( JNIEnv* env, jobject thiz )
{
 CCLog( "zhtlog:cconAfterDownload() ok!" );
}
void cconBeforeApply( JNIEnv* env, jobject thiz )
{
 CCLog( "zhtlog:cconBeforeApply() ok!" );
}
void cconBeforeDownload( JNIEnv* env, jobject thiz )
{
 CCLog( "zhtlog:cconBeforeDownload() ok!" );
}
void cconInitFinish(JNIEnv* env, jobject thiz,jint code)
{
 CCLog( "zhtlog:cconInitFinish=%d",(int)code );
}
void cconUnsubscribeFinish(JNIEnv* env, jobject thiz, jint code )
{
 CCLog( "zhtlog:cconUnsubscribeFinish=%d",(int)code );
}
void cconBillingFinish( JNIEnv* env, jobject thiz,jstring strvv )
{
 string strmy = jstring2str( env,strvv);
 CCLog( "zhtlog:cconBillingFinish= %s",strmy.c_str() );
}
static JNINativeMethod s_aamethods[] = {
 {"cconAfterApply",              "()V",  (void*)cconAfterApply       },
 {"cconAfterDownload",       "()V",  (void*)cconAfterDownload    },
 {"cconBeforeApply",           "()V",  (void*)cconBeforeApply      },
 {"cconBeforeDownload",    "()V",  (void*)cconBeforeDownload   },
 {"cconInitFinish",                "(I)V", (void*)cconInitFinish       },
 {"cconUnsubscribeFinish", "(I)V", (void*)cconUnsubscribeFinish},
 {"cconBillingFinish",           "(Ljava/lang/String;)V", (void*)cconBillingFinish    },
};
#define CBUT_NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
int CBsYdmmWrap::reg_jnifun()
{
 JavaVM* vm  = JniHelper::getJavaVM();
 JNIEnv* env = 0; 
 vm->GetEnv((void**)&env, JNI_VERSION_1_4);
 jclass cls = JniHelper::getClassID("ysgame/zhtph/game/CYsYdmmBs");
 int len    = sizeof(s_aamethods)/sizeof(s_aamethods[0]); 
 if (env->RegisterNatives(cls, s_aamethods, len) < 0)
 {
  CCLog( "zhtlog:%s","reg_jinfun() fail! 201" );
  return 201;
 }
 CCLog( "zhtlog:%s,retfun=%d","reg_jinfun() ok!",len );
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值