JNI JAVA调C++

来源:互联网 发布:淘宝手工食品放哪类目 编辑:程序博客网 时间:2024/06/08 05:59

一个同事写的工具类,Java和C++互相调用支付方法,研究中,经常混淆到底是JAVA调C++还是 C++调JAVA,有点晕,总结一下,代码仅供参考。

C++部分:

JNIUtil.h:

#ifndef _JNIUTIL_

#define _JNIUTIL_

#include "cocos2d.h"

USING_NS_CC


//修改这里 

// java调C++

#define JAVA_PAY_SUCCESS_CALLBACK Java_org_cocos2dx_cpp_JNIUtil_paySucceed

#define JAVA_PAY_FAIL_CALLBACK Java_org_cocos2dx_cpp_JNIUtil_payFail

#define JAVA_NOTFINISHGAME_CALLBACK Java_org_cocos2dx_cpp_JNIUtil_notFinishGame

//C++调java

//"org/cocos2dx/cpp"是包名 "JNIUtil"是类名

const static std::string JAVA_PACKAGE_CLASS_NAME = "org/cocos2dx/cpp/JNIUtil";

//支付方法要在"org/cocos2dx/cpp/JNIUtil"类里,pay()传的是一个int型的payType到java端

const static std::string JAVA_PAY_FUNCTION_NAME = "pay";

//isDistinct要在"org/cocos2dx/cpp/JNIUtil"类里,isDistinct()获取的是一个bool值

const static std::string JAVA_ISDISTINCT_FUNCTION_NAME = "isDistinct";

const static std::string JAVA_FINISHGAME_NAME = "finishGame";

//枚举值

enum EnumPayType{

GOODS_0 = 0,  
GOODS_DAILY = 1001,
GOODS_POWER_10 = 1002,
GOODS_HEART_10 = 1003,
GOODS_LAST_10 = 1004,
GOODS_NEWGIFT=1005,
GOODS_RESURGENCE=1006,
GOODS_PASS=1007,
};

class JNIUtil{

public :

static std :: function<void()> _successCallback;

static std :: function<void()> _failCallback;

/**
* 使用JNI调用Java端:第三方支付
* @param payType  礼包ID
* @param successCallback 支付成功后的回调  
* @param failCallback  支付失败后的回调  
*/

static void pay(EnumType payType,const std::function<void()>& successCallback,const std :: function<void()> & failCallback);

//使用JNI调用java端:获取是否清晰,distinct-清晰

static bool isDistinct();

//使用JNI调用java端:开启系统弹窗,提示是否退出确认

static bool finishGame();

static void paySuccess();

static void payFail();

//判断返回键点击是否有效,已返回则再按无效

static bool isBack;

private:

};

#endif


============================================================


JNIUtil.cpp:

#include "JNIUtil.h"

#if (CC_TARGET_PLATFORM ==CC_PLATFORM_ANDROID)

#include "platform/android/jni/JniHelper.h"

#include "platform/android/jni/Java_org_cocos2dx_lib_Cocos2dxHelper.h"

#include <jni.h>

#endif

std :: function<void()> JNIUtil :: _successCallback =nullptr;

std :: function<void()> JNIUtil :: _failCallback =nullptr;

bool JNIUtil :: isBack =false;

//使用JNI调用java端:第三方支付

void JNIUtil::pay(EnumType payType,const std::function<void()>& successCallback,const std :: function<void()> & failCallback){

_successCallback = successCallback;

_failCallback = failCallback;

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

JniMethodInfo t;

if(JniHelper :: getStaticMethodInfo(t,JAVA_PACKAGE_CLASS_NAME.c_str(),JAVA_PAY_FUNCTION_NAME.c_str(),"(I)V")

{

t.env->CallStaticVoidMethod(t.classID,t.methodID,payType);

t.env->DeleteLocalRef(t.classID);

}

#else

//win32平台测试,默认paySuccess

paySuccess();

#endif

}

//使用JNI调用java端,获取是否清晰,distinct-清晰

bool JNIUtil :: isDistinct(){

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

JniMethodInfo t;

bool isHave = JniHelper :: getStaticMethodInfo(t,JAVA_PACKGAE_CLASS_NAME.c_str(),JAVA_ISDISTINCT_FUNCTION_NAME.c_str(),"()Z");

if(isHave){

bool iret = t.env->CallStaticBooleanMethod(t.classID,t.methodID);

return iret;

}

#else

//win32平台,默认false

return false;

#endif

}


//java端支付完后回调cpp端的接口

#ifdef __cplusplus

extern "C"{

#endif

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

void JAVA_PAY_SUCCESS_CALLBACK(JNIEnv * env , jobject thiz){

JNIUtil :: paySuccess();

void JAVA_PAY_FAIL_CALLBACK(JNIEnv * env , jpbject thiz){

JNIUtil :: payFail();

}

void JAVA_NOTFINISHGAME_CALLBACK(JNIEnv *env , jobject thiz){

JNIUtil :: isBack = false;

}

#endif

#ifdef __cplusplus

}

#endif


void JNIUtil :: paySuccess(){

if(_successCallback) _successCallback();

}

void JNIUtil :: payFail(){

if(_failCallback) _failCallback();

}


void JNIUtil ::finishGame(){

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

JniMethodInfo t;
if(JniHelper :: getStaticMethodInfo(t,JAVA_PACKAGE_CLASS_NAME.c_str(),JAVA_FINISHGAMEFUNCTION_NAME.c_str(),"()V")

{

t.env->CallStaticVoidMethod(t.classID,t.methoID);

t.env->DeleteLocalRef(t.classID);

}

#else

JNIUtil :: isBack = false;

#endif

}


============================================================

JAVA部分:

JNIUtil.java:

package org.cocos2dx.cpp;


import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.util.Log;


import com.skyfire.actress.game.girl.R;
import com.w.sdkunite.PayResultCallback;
import com.w.sdkunite.X;
import com.w.sdkunite.pay.LocalPayInfo; 


public class JNIUtil {
private static Cocos2dxActivity _act;
private static JNIUtil instance;

public static int GOODS_0 = 0;//非法值
public static int GOODS_DAILY = 1001;//每日奖励
public static int GOODS_POWER_10=1002;//10个体力
public static int GOODS_HEART_10=1003;//10个爱心
public static int GOODS_LAST_10=1004;//倒数10秒礼包 增加游戏时长
public static int GOODS_NEWGIFT=1005;//新手礼包5个体力 4个爱心
public static int GOODS_RESURGENCE=1006;//复活礼包当前进度重新开始 +2体力
public static int GOODS_PASS=1007;//通关礼包获得12体力


public static void init(Cocos2dxActivity act) {
_act = act;


X.getInstance(act).initSdks(act);


}
boolean isDistinct(){//清晰模糊开关

//在X.java中设置GLOBAL_CLEAR_TIPS_TOGGLE 定义成int值 作为开关
if(X.GLOBAL_CLEAR_TIPS_TOGGLE == 1)
return true;
else
return false;
}

public static void pay(final int id) {
LocalPayInfo localInfo = new LocalPayInfo();
switch (id) {
case 1001:

localInfo.payMsg="每日礼包";
localInfo.money=2000;

break;

case 1002:
localInfo.payMsg="10个体力";
localInfo.money=2000;

break;


case 1003:
localInfo.payMsg="10个爱心";
localInfo.money=2000;

break;


case 1004:
localInfo.payMsg="倒数加时";
localInfo.money=2000;

break;

case 1005:
localInfo.payMsg="新手礼包";
localInfo.money=2000;

break;
case 1006:
localInfo.payMsg="复活礼包";
localInfo.money=2000;

break;
case 1007:
localInfo.payMsg="通关礼包";
localInfo.money=2000;
default:
break;
}


int money = localInfo.money;

localInfo.desc = "购买此产品需" + money / 100
+ "元,由运营商代收(不含通讯费), 客服电话:123456798";


//runNativePaySucceedCallback(id);
X.getInstance(_act).pay(_act, localInfo);


X.getInstance(_act).setPayResultCallback(new PayResultCallback() {


@Override
public void payResultCallback(LocalPayInfo info, int payState) {
if (payState == X.PAY_SUCCESS) {
runNativePaySucceedCallback(id);
} else {
runNativeCallback(id);
}
}
});
}

//原生方法,调用c++的paySucceed和payFail
public native static void paySucceed(int id);
public native static void payFail(int id);
public static native void notFinishGame();

public static void runNativePaySucceedCallback(final int id) {
Cocos2dxGLSurfaceView.getInstance().queueEvent(new Runnable() {
@Override
public void run() {
paySucceed(id);
}
});
}
public static void runNativeCallback(final int id) {
Cocos2dxGLSurfaceView.getInstance().queueEvent(new Runnable() {
@Override
public void run() {
payFail(id);
}
});
}

public static void finishGame() {
_act.runOnUiThread(new Runnable() {
@Override
public void run() {


new AlertDialog.Builder(_act)
.setTitle(R.string.title)
.setMessage(R.string.content)
.setNegativeButton(R.string.concel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
_act.runOnGLThread(new Runnable() {


@Override
public void run() {
notFinishGame();
}
});
}
})
.setPositiveButton(R.string.confirm,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
_act.finish();
System.exit(0);
}
}).show();


}


});
}



}


留作以后写工具类的参考。





原创粉丝点击