爱大鸟LoveShootBirds强联网移动SDK添加(

来源:互联网 发布:linux find当前目录 编辑:程序博客网 时间:2024/05/01 16:38

Java强联网代码

<1>添加包mmbilling1.2.1.jar和libcasdkjni.so、libidentifyapp.so两个文件

<2>loveshootBirdsAndroid.java

package com.qingxue.game;import mm.purchasesdk.OnPurchaseListener;import mm.purchasesdk.Purchase;import org.cocos2dx.lib.Cocos2dxActivity;import org.cocos2dx.lib.Cocos2dxGLSurfaceView;import android.app.ProgressDialog;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;public class LoveShootBirdsAndroid extends Cocos2dxActivity{public final static int SHOW_STONE = 1;//单例    public static LoveShootBirdsAndroid instance = null;      public Purchase purchase;private Context context;private ProgressDialog mProgressDialog;private IAPListener mListener;// 计费信息private static final String APPID = "300008073477";private static final String APPKEY = "ABF7F92E2A54F1AB";// 计费点信息private static final String LEASE_PAYCODE = "30000807347701";    private static native void getStone();  //购买石头,实现石头界面的刷新    protected void onCreate(Bundle savedInstanceState)    {super.onCreate(savedInstanceState);instance = this;mProgressDialog = new ProgressDialog(this);mProgressDialog.setIndeterminate(true);mProgressDialog.setMessage("请稍候...");context = this;    IAPHandler iapHandler = new IAPHandler(this);/** * IAP组件初始化.包括下面3步。 *//** * step1.实例化PurchaseListener。实例化传入的参数与您实现PurchaseListener接口的对象有关。 * 例如,此Demo代码中使用IAPListener继承PurchaseListener,其构造函数需要Context实例。 */mListener = new IAPListener(this, iapHandler);/** * step2.获取Purchase实例。 */purchase = Purchase.getInstance();/** * step3.向Purhase传入应用信息。APPID,APPKEY。 需要传入参数APPID,APPKEY。 APPID,见开发者文档 * APPKEY,见开发者文档 */try {purchase.setAppInfo(APPID, APPKEY);} catch (Exception e1) {e1.printStackTrace();}/** * step4. IAP组件初始化开始, 参数PurchaseListener,初始化函数需传入step1时实例化的 * PurchaseListener。 */try {purchase.init(context, mListener);} catch (Exception e) {e.printStackTrace();}showProgressDialog();}    public Cocos2dxGLSurfaceView onCreateView() {    Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);    // LoveShootBirdsAndroid should create stencil buffer    glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);    return glSurfaceView;    }    static {        System.loadLibrary("cocos2dcpp");    }             private void showProgressDialog() {if (mProgressDialog == null) {mProgressDialog = new ProgressDialog(LoveShootBirdsAndroid.this);mProgressDialog.setIndeterminate(true);mProgressDialog.setMessage("请稍候.....");}if (!mProgressDialog.isShowing()) {mProgressDialog.show();}}public void dismissProgressDialog() {if (mProgressDialog != null && mProgressDialog.isShowing()) {mProgressDialog.dismiss();}} //获取实例    public static Object getInstance()    {          Log.e("instance", "jobj create Already");        return instance;      }      private Handler mHandler = new Handler()    {                public void handleMessage(Message msg)         {            switch(msg.what)            {            case SHOW_STONE:            buyStone();            break;            }        }    };        public void buyStoneSend()    {    Log.e("buyStoneSend", "buyStoneSend");    Message msg = mHandler.obtainMessage();    msg.what = SHOW_STONE;    msg.sendToTarget();    }    public void buyStone(){Log.e("buyStone","buyStone");order(instance, LEASE_PAYCODE, mListener);}public void order(Context context, String mPaycode , OnPurchaseListener listener) {Log.e("order","order");try {    purchase.order(context, mPaycode, mListener);} catch (Exception e) {e.printStackTrace();}}   public void MMpaySuccess(String code)   {    if(code == null)  return;    Log.e("MMpaySuccess",code);    if(code.equals(LEASE_PAYCODE)){Log.e("buyStoneSuccess","buyStoneSuccess");//在这实现Java调用C++代码,实现石头的界面刷新getStone();    }   }    public void MMpayFaild()   {    Log.e("faild","faild");   }}<3>IAPHandler.javapackage com.qingxue.game;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.os.Handler;import android.os.Message;import android.widget.Toast;public class IAPHandler extends Handler {public static final int INIT_FINISH = 10000;public static final int BILL_FINISH = 10001;public static final int QUERY_FINISH = 10002;public static final int UNSUB_FINISH = 10003;private LoveShootBirdsAndroid context;public IAPHandler(Activity context) {this.context = (LoveShootBirdsAndroid) context;}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);int what = msg.what;switch (what) {case INIT_FINISH:initShow((String) msg.obj);context.dismissProgressDialog();break;default:break;}}private void initShow(String msg) {Toast.makeText(context, "初始化:" + msg, Toast.LENGTH_LONG).show();}public void showDialog(String title, String msg) {AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setTitle(title);builder.setIcon(context.getResources().getDrawable(R.drawable.icon));builder.setMessage((msg == null) ? "Undefined error" : msg);builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton) {dialog.dismiss();}});builder.create().show();}}<4>IAPListener.javapackage com.qingxue.game;import java.util.HashMap;import mm.purchasesdk.OnPurchaseListener;import mm.purchasesdk.Purchase;import mm.purchasesdk.PurchaseCode;import android.content.Context;import android.os.Message;import android.util.Log;public class IAPListener implements OnPurchaseListener {private final String TAG = "IAPListener";private LoveShootBirdsAndroid context;private IAPHandler iapHandler;public IAPListener(Context context, IAPHandler iapHandler) {this.context = (LoveShootBirdsAndroid) context;this.iapHandler = iapHandler;}@Overridepublic void onInitFinish(int code){Log.d(TAG, "Init finish, status code = " + code);Message message = iapHandler.obtainMessage(IAPHandler.INIT_FINISH);String result = "初始化结果:" + Purchase.getReason(code);message.obj = result;message.sendToTarget();}@Overridepublic void onBillingFinish(int code, HashMap arg1){Log.e(TAG, "billing finish, status code = " + code);System.out.println("billing finish, status code = " + code);String result = "订购结果:订购成功";Message message = iapHandler.obtainMessage(IAPHandler.BILL_FINISH);// 商品信息String paycode =  null;// 商品的交易 ID,用户可以根据这个交易ID,查询商品是否已经交易String tradeID = null;if (code == PurchaseCode.ORDER_OK ) {/** * 商品购买成功或者已经购买。 此时会返回商品的paycode,orderID,以及剩余时间(租赁类型商品) */if (arg1 != null) {paycode = (String) arg1.get(OnPurchaseListener.PAYCODE);if (paycode != null && paycode.trim().length() != 0) {result = result + ",Paycode:" + paycode;}tradeID = (String) arg1.get(OnPurchaseListener.TRADEID);if (tradeID != null && tradeID.trim().length() != 0) {result = result + ",tradeid:" + tradeID;}}//订购成功context.MMpaySuccess(paycode);} else {/** * 表示订购失败。 *///订购失败result = "订购结果:" + Purchase.getReason(code);}if(paycode == null) context.MMpayFaild();context.dismissProgressDialog();System.out.println(result);}@Overridepublic void onAfterApply() {// TODO Auto-generated method stub}@Overridepublic void onAfterDownload() {// TODO Auto-generated method stub}@Overridepublic void onBeforeApply() {// TODO Auto-generated method stub}@Overridepublic void onBeforeDownload() {// TODO Auto-generated method stub}@Overridepublic void onQueryFinish(int arg0, HashMap arg1) {// TODO Auto-generated method stub}@Overridepublic void onUnsubscribeFinish(int arg0) {// TODO Auto-generated method stub}}AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.qingxue.game"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk android:minSdkVersion="8" />    <application        android:icon="@drawable/icon"        android:label="@string/app_name" >        <activity            android:name=".LoveShootBirdsAndroid"            android:configChanges="orientation"            android:screenOrientation="landscape"            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <service            android:name="mm.purchasesdk.iapservice.PurchaseService"            android:exported="true" >            <!-- android:process="mm.iapServices" > -->            <intent-filter android:priority="230" >                <action android:name="com.aspire.purchaseservice.BIND" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>            <intent-filter android:priority="230" >                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.SAFIAP.COMPONENT" >                </category>            </intent-filter>        </service>        <!-- android:excludeFromRecents="true" -->        <!-- android:launchMode="singleInstance" -->        <activity            android:name="mm.purchasesdk.iapservice.BillingLayoutActivity"            android:configChanges="orientation|keyboardHidden"            android:theme="@android:style/Theme.Translucent" >            <intent-filter android:priority="230" >                <action android:name="com.qingxue.game.com.mmiap.activity" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>        <!-- android:process="safiap.framework.safframeworkmanager" begin -->        <service            android:name="safiap.framework.SafFrameworkManager"            android:exported="true"            android:process="safiap.framework" >            <intent-filter android:priority="600" >                <!-- ID for services declared in AIDL -->                <action android:name="safiap.framework.sdk.ISAFFramework" />            </intent-filter>            <intent-filter android:priority="600" >                <!-- ID for services declared in AIDL -->                <action android:name="safiap.framework.ACTION_START_DOWNLOAD" />            </intent-filter>            <intent-filter android:priority="600" >                <!-- ID for services declared in AIDL -->                <action android:name="safiap.framework.ACTION_CHECK_UPDATE" />            </intent-filter>        </service>        <!-- receivers -->        <receiver android:name="safiap.framework.CheckUpdateReceiver" >            <intent-filter>                <action android:name="safiap.framework.ACTION_CANCEL_NOTIFICATION" />            </intent-filter>            <intent-filter>                <action android:name="safiap.GET_SHARED_DATA" />            </intent-filter>            <intent-filter>                <action android:name="safiap.framework.ACTION_SET_TIMER" />            </intent-filter>        </receiver>        <activity            android:name="safiap.framework.ui.UpdateHintActivity"            android:configChanges="orientation"            android:excludeFromRecents="true"            android:launchMode="singleInstance"            android:theme="@android:style/Theme.Translucent.NoTitleBar" >            <intent-filter>                <action android:name="safiap.framework.ACTION_TO_INSTALL" />            </intent-filter>            <intent-filter>                <action android:name="safiap.framework.ACTION_TO_INSTALL_IAP" />            </intent-filter>            <intent-filter>                <action android:name="safiap.framework.ACTION_NETWORK_ERROR_IAP" />            </intent-filter>            <intent-filter>                <action android:name="safiap.framework.ACTION_NETWORK_ERROR_FRAMEWORK" />            </intent-filter>        </activity>        <service            android:name="safiap.framework.logreport.monitor.handler.LogreportHandler"            android:process=":remote" />        <!-- android:process="safiap.framework.safframeworkmanager" end -->    </application>    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.SEND_SMS" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    <uses-permission android:name="android.permission.READ_SMS" /></manifest>C++部分<1>头文件#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include <jni.h> #include "platform/android/jni/JniHelper.h" #include <android/log.h> #endif <2>支付部分代码C++调Javavoid GameScene::buyStone(){if(! CCDirector::sharedDirector()->isPaused()){CCDirector::sharedDirector()->pause();}    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 JniMethodInfo minfo;  jobject jobj;  if (JniHelper::getStaticMethodInfo(minfo, "com/qingxue/game/LoveShootBirdsAndroid",   "getInstance", "()Ljava/lang/Object;"))  {  jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID); if (JniHelper::getMethodInfo(minfo, "com/qingxue/game/LoveShootBirdsAndroid",  "buyStoneSend", "()V"))  {  CCLog("jobj start");if(jobj == NULL) {return;}minfo.env->CallVoidMethod(jobj, minfo.methodID);  if(CCDirector::sharedDirector()->isPaused()){const char* LeavedStoneNum = ((CCString*)_gameScene->chnStrings->objectForKey("leavedStoneNum"))->m_sString.c_str(); _gameScene->_panelLayer->leavedStoneLabel->setString(CCString::createWithFormat("%s: %d",LeavedStoneNum, _gameScene->_panelLayer->leavedStoneNum)->getCString());    CCDirector::sharedDirector()->resume();}CCLog("jobj  end");}  }   #endif}Java调用C++//在C++中对Java文件的private static native void getStone();方法实现为:#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 extern "C"{void Java_com_qingxue_game_GunStreet_getStone(JNIEnv*  env, jobject thiz){CCLog("Java_com_qingxue_game_GunStreet_getStone");_gameScene->_panelLayer->leavedStoneNum += 15;const char* LeavedStoneNum = ((CCString*)_gameScene->chnStrings->objectForKey("leavedStoneNum"))->m_sString.c_str(); _gameScene->_panelLayer->leavedStoneLabel->setString(CCString::createWithFormat("%s: %d",LeavedStoneNum, _gameScene->_panelLayer->leavedStoneNum)->getCString());}}#endif


 

 

0 0
原创粉丝点击