您的位置:首页 > 编程语言 > C语言/C++

线程问题 之 支付时支付界面未弹出问题(C++调用Java)

2014-08-05 14:54 453 查看
<1>问题:

就是当你点击购买时,购买界面根本没有弹出来,这里是C++调用Java.

<2>Java端代码实现.

private static Handler mHandler = null;


//根据订单号购买商品(由C++调用)
public void buyWithCooOrderSerial(final String orderId, final int tag)
{
mHandler = new Handler(Looper.getMainLooper());
mHandler.postDelayed(new Runnable()
{

@Override
public void run() {
if(ctx != null)
{
Log.e("****所购买的商品 订单号和标识号(Java端显示)****", "订单号:" + orderId + "***标识号:" + String.valueOf(tag));

//订单号productId
String productIdArray[] = {
"115429-20140801-105232094-84",
"115429-20140728-194402904-98",
"115429-20140728-194723885-16",
"115429-20140728-194822884-58",
"115429-20140728-194909696-39",
"115429-20140728-195031058-12",
"115429-20140728-195115225-34"
};

// 商品名字
String productNameArray[] = {
"月卡",
"金元宝",
"一堆金元宝",
"一袋金元宝",
"一盒金元宝",
"一桶金元宝",
"一箱金元宝"
};

//商品价格
double moneyArray[]  = {30, 6, 30, 98, 198, 368, 648};

NdBuyInfo buyInfo = new NdBuyInfo();
buyInfo.setSerial(orderId);
buyInfo.setProductId(productIdArray[tag]);
buyInfo.setProductName(productNameArray[tag]);
buyInfo.setProductPrice(moneyArray[tag]);
buyInfo.setCount(1);
buyInfo.setPayDescription("商品描述信息:我就是这么帅!!!");

//购买结果监听
int aError = NdCommplatform.getInstance().ndUniPayAsyn(buyInfo, ctx, new NdMiscCallbackListener.OnPayProcessListener() {
@Override
public void finishPayProcess(int code) {
tipsBuyCode(code);
}

});

if(aError != 0){
Log.e("**商品格式不对***", "***商品格式不对**");
}
}
}

}, 1);
}


总结:解决方案就是这个好用的Handler ,Handler相当于开一个线程,当使用完毕后,自动回收.这就比较爽了.因此当在C++调用Java时,Java端代码的实现,请考虑Handler!

<3>C++端调用Java代码.
void My91LoginImplAndroid::buyWithCooOrderSerial(string orderId)  //根据订单号购买商品
{
this->myOrderId = orderId;
_my91Login->myOrderId = orderId;

CCLOG("*******Android平台根据订单号买商品*******");
JniMethodInfo minfo;
jobject jobj;
if(JniHelper::getStaticMethodInfo(minfo, CLASS_NAME, "getInstance", "()Ljava/lang/Object;"))
{
jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
if(JniHelper::getMethodInfo(minfo, CLASS_NAME, "buyWithCooOrderSerial", "(Ljava/lang/String;I)V"))
{
if(jobj == NULL)
{
return;
}
CCLog("***订单号:%s********标识号: %d*******", orderId.c_str(), tag);
//传递订单号 和 标识 参数
jstring jorderId = minfo.env->NewStringUTF(orderId.c_str()); //string 转化jstring
jint jtag = tag;  //int转化jint
minfo.env->CallVoidMethod(jobj, minfo.methodID, jorderId, jtag);
CCLOG("*****JNI调用订单购买成功******");
}
}
}
总结:注意里面有C++的string转化为Java的String类型.其次,Java段代码的final对C++这端的签名没影响.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: