在游戏中,C++调用Java是很常见的,特别是在使用第三方SDK的时候。我仅仅写以下一些常用的调用方法。在使用之前,首先得包含相应的头文件。
//#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) #include "platform/android/jni/JniHelper.h" #include <jni.h> //#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);
<span style="white-space:pre"> </span>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