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

被折叠的 条评论
为什么被折叠?



