1,写c++调用方法
通过JNI获取java虚拟机,再获取当前程序的JNI环境,通过JNI环境获取需要调用的java类信息,再获取需要调用的java类中的函数信息。再通过JNI环境调用,使用类信息、函数信息,调用对应的java函数。
#include "cocos2d.h"
#include "config.h"
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
记得引用JniHelper.h时,加上#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID),不然iOS版本会报错。
需要使用的接口如下:
static bool getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode);
static bool getMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode);
例如我的方法:
.h 中声明
static void Pay_WXPay(const char *partnerid,const char *prepayid,const char *package,const char *noncestr,const char *timestamp,const char *sign);
.cpp中实现
void CMiscHelper::Pay_WXPay(const char *partnerid,const char *prepayid,const char *package,const char *noncestr,const char *timestamp,const char *sign)
{
JniMethodInfo t;
if(JniHelper::getStaticMethodInfo(t, (string(CLASS_NAME)+string("MiscHelper")).c_str(), "Pay_WXPay", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljav a/lang/String;Ljava/lang/String;)V"))
{
jstring jpartnerid = t.env->NewStringUTF(partnerid);
jstring jprepayid = t.env->NewStringUTF(prepayid);
jstring jpackage = t.env->NewStringUTF(package);
jstring jnoncestr = t.env->NewStringUTF(noncestr);
jstring jtimestamp = t.env->NewStringUTF(timestamp);
jstring jsign = t.env->NewStringUTF(sign);
t.env->CallStaticVoidMethod(t.classID, t.methodID, jpartnerid,jprepayid,jpackage,jnoncestr,jtimestamp,jsign);
t.env->DeleteLocalRef(jpartnerid);
t.env->DeleteLocalRef(jprepayid);
t.env->DeleteLocalRef(jpackage);
t.env->DeleteLocalRef(jnoncestr);
t.env->DeleteLocalRef(jtimestamp);
t.env->DeleteLocalRef(jsign);
t.env->DeleteLocalRef(t.classID);
}
}
类型中 Ljava/lang/String;
分号一定要加上!!!
然后/tools/tolua/xxx python genbindings_xxx.py
绑定后自动生成文件默认在auto中,lua_jni_auto.cpp
文件中如果没有添加安卓判断记得添加:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
否则会报错!!!
网友评论