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();
}
});
}
}
留作以后写工具类的参考。
- android JNI简单的java调C
- android JNI简单的C调java
- android jni c语言回调java
- java 调 C (jni 与 jna)
- Mac下Java JNI 调C
- Mac下Java JNI 调C
- Java调用C JNI
- jni c调用java
- JNI java c 调用
- JNI C调用Java
- Java JNI 调用c/cpp
- C语言调用Java JNI
- java JNI调用c程序
- JNI学习-C 调用Java
- JNI-->Java调用C语言
- JNI-->C调用Java语言
- Android JNI C调用Java
- jni - c 调用java方法
- 笔记:imooc-vue 音乐app
- dubbo实现SOA的管理
- php+nginx高并发大流量站点nginx优化
- 83. Remove Duplicates from Sorted List
- 水平集算法
- JNI JAVA调C++
- Android 手势密码锁
- Git 不需要重复输入账号和
- SQL DELETE(删除)
- Codec ALC5672
- Jquery的父,子,兄弟节点查找方法
- lwj_C#_字典
- 2017年12月20日
- 数据结构之查找(二)——顺序表查找