在游戏中,C++调用Java是很常见的,特别是在使用第三方SDK的时候。我仅仅写以下一些常用的调用方法。在使用之前,首先得包含相应的头文件。
- //#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
- #include "platform/android/jni/JniHelper.h"
- #include <jni.h>
- //#endif
getStaticMethodInfo和getMethodInfo的最后一个参数如下图
1.静态无参数无返回值的函数
- #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);
- }
- #endif
2.静态int参数无返回值的
- #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);
- }
- CCLog("jni-java函数执行完毕");
- #endif
3.静态string参数无返回值的函数
- #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);
- }
- CCLog("jni-java函数执行完毕");
- #endif
4.静态无参数string返回值的函数
- #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));
- }
- CCLog("jni-java函数执行完毕");
- #endif
5.非静态函数
先调用静态函数获得调用的对象,然后调用非静态函数,注意:非静态函数返回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);
- }
- else
- {
- CCLog("%s","dosomething isn't exist");
- }
- }
- CCLog("jni-java函数执行完毕");
- #endif
最后注意:C++调用的Java方法都是在非UI线程中。