在游戏中,C++调用Java是很常见的,特别是在使用第三方SDK的时候。我仅仅写以下一些常用的调用方法。在使用之前,首先得包含相应的头文件。
//#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#include
//#endif
getStaticMethodInfo和getMethodInfo的最后一个参数如下图
#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
CCLog("--------------------->>>>>>>>>here ");
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/zhycheng/tt/CppCallJava","sayHello", "()V");
CCLog("is have %d",isHave);
if (!isHave) {
CCLog("jni:此函数不存在");
}else{
CCLog("jni:此函数存在");
//调用此函数
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);minfo.env->DeleteLocalRef(minfo.classID);
}
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
JniMethodInfo minfo;//定义Jni函数信息结构体
//getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
bool isHave = JniHelper::getStaticMethodInfo(minfo,
"com/zhycheng/tt/CppCallJava", "sayInt","(I)V");
if (!isHave) {
CCLog("jni:此函数不存在");
}else{
CCLog("jni:此函数存在");
//调用此函数
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,1110);minfo.env->DeleteLocalRef(minfo.classID);
}
CCLog("jni-java函数执行完毕");
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
JniMethodInfo minfo;//定义Jni函数信息结构体
//getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
bool isHave = JniHelper::getStaticMethodInfo(minfo,
"com/zhycheng/tt/CppCallJava", "sayString","(Ljava/lang/String;)V");
if (!isHave) {
CCLog("jni:此函数不存在");
}else{
CCLog("jni:此函数存在");
//调用此函数
jstring jst = minfo.env->NewStringUTF("zhycheng");
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,jst);minfo.env->DeleteLocalRef(minfo.classID);
}
CCLog("jni-java函数执行完毕");
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
JniMethodInfo minfo;//定义Jni函数信息结构体
//getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
bool isHave = JniHelper::getStaticMethodInfo(minfo,
"com/zhycheng/tt/CppCallJava", "getPath","()Ljava/lang/String;");
if (!isHave) {
CCLog("jni:此函数不存在");
}else{
CCLog("jni:此函数存在");
//调用此函数
jstring str=(jstring) minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
jboolean iscopy;
CCLog("%s",minfo.env->GetStringUTFChars(str,&iscopy));minfo.env->DeleteLocalRef(minfo.classID);
minfo.env->ReleaseStringUTFChars(*(minfo.env),str,0);//释放内存
}
CCLog("jni-java函数执行完毕");
#endif
先调用静态函数获得调用的对象,然后调用非静态函数,注意:非静态函数返回Object类型。
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
JniMethodInfo minfo;//定义Jni函数信息结构体
//getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
bool isHave = JniHelper::getStaticMethodInfo(minfo,
"com/zhycheng/tt/CppCallJava", "getInstance","()Ljava/lang/Object;");
if (!isHave)
{
CCLog("jni:此函数不存在");
}
else
{
CCLog("jni:此函数存在");
//调用此函数
jobject obj= minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
isHave=JniHelper::getMethodInfo(minfo,
"com/zhycheng/tt/CppCallJava", "dosomething","()V");
if(isHave)
{
CCLog("jni:dosomething 此函数存在");
minfo.env->CallVoidMethod(obj, minfo.methodID);minfo.env->DeleteLocalRef(minfo.classID);
}
else
{
CCLog("%s","dosomething isn't exist");
}
}
CCLog("jni-java函数执行完毕");
#endif