游戏中C++调用Java

来源:互联网 发布:科密e100如何导出数据 编辑:程序博客网 时间:2024/05/22 07:03

在游戏中,C++调用Java是很常见的,特别是在使用第三方SDK的时候。我仅仅写以下一些常用的调用方法。在使用之前,首先得包含相应的头文件。

[cpp] view plaincopy
  1. //#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)  
  2. #include "platform/android/jni/JniHelper.h"  
  3. #include <jni.h>  
  4. //#endif  

getStaticMethodInfo和getMethodInfo的最后一个参数如下图




1.静态无参数无返回值的函数

[cpp] view plaincopy
  1. #if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)  
  2.     CCLog("--------------------->>>>>>>>>here ");  
  3.     JniMethodInfo minfo;  
  4.     bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/zhycheng/tt/CppCallJava","sayHello""()V");  
  5.     CCLog("is have %d",isHave);  
  6.     if (!isHave) {  
  7.             CCLog("jni:此函数不存在");  
  8.         }else{  
  9.             CCLog("jni:此函数存在");  
  10.             //调用此函数  
  11.             minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);  
  12.         }  
  13. #endif  

2.静态int参数无返回值的

[cpp] view plaincopy
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台  
  2.     JniMethodInfo minfo;//定义Jni函数信息结构体  
  3.     //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数  
  4.     bool isHave = JniHelper::getStaticMethodInfo(minfo,  
  5.                                                 "com/zhycheng/tt/CppCallJava""sayInt","(I)V");  
  6.   
  7.     if (!isHave) {  
  8.         CCLog("jni:此函数不存在");  
  9.     }else{  
  10.         CCLog("jni:此函数存在");  
  11.         //调用此函数  
  12.         minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,1110);  
  13.     }  
  14.     CCLog("jni-java函数执行完毕");  
  15. #endif  

3.静态string参数无返回值的函数

[cpp] view plaincopy
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台  
  2.     JniMethodInfo minfo;//定义Jni函数信息结构体  
  3.     //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数  
  4.     bool isHave = JniHelper::getStaticMethodInfo(minfo,  
  5.                                                 "com/zhycheng/tt/CppCallJava""sayString","(Ljava/lang/String;)V");  
  6.   
  7.     if (!isHave) {  
  8.         CCLog("jni:此函数不存在");  
  9.     }else{  
  10.         CCLog("jni:此函数存在");  
  11.         //调用此函数  
  12.         jstring jst = minfo.env->NewStringUTF("zhycheng");  
  13.         minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,jst);  
  14.     }  
  15.     CCLog("jni-java函数执行完毕");  
  16. #endif  

4.静态无参数string返回值的函数

[cpp] view plaincopy
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台  
  2.     JniMethodInfo minfo;//定义Jni函数信息结构体  
  3.     //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数  
  4.     bool isHave = JniHelper::getStaticMethodInfo(minfo,  
  5.                                                 "com/zhycheng/tt/CppCallJava""getPath","()Ljava/lang/String;");  
  6.   
  7.     if (!isHave) {  
  8.         CCLog("jni:此函数不存在");  
  9.     }else{  
  10.         CCLog("jni:此函数存在");  
  11.         //调用此函数  
  12.         jstring str=(jstring) minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);  
  13.         jboolean iscopy;  
  14.         CCLog("%s",minfo.env->GetStringUTFChars(str,&iscopy));  
  15.     }  
  16.     CCLog("jni-java函数执行完毕");  
  17. #endif  

5.非静态函数

先调用静态函数获得调用的对象,然后调用非静态函数,注意:非静态函数返回Object类型。

[cpp] view plaincopy
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台  
  2.         JniMethodInfo minfo;//定义Jni函数信息结构体  
  3.         //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数  
  4.         bool isHave = JniHelper::getStaticMethodInfo(minfo,  
  5.                                                     "com/zhycheng/tt/CppCallJava""getInstance","()Ljava/lang/Object;");  
  6.   
  7.         if (!isHave)  
  8.         {  
  9.             CCLog("jni:此函数不存在");  
  10.         }  
  11.         else  
  12.         {  
  13.             CCLog("jni:此函数存在");  
  14.             //调用此函数  
  15.             jobject obj= minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);  
  16.             isHave=JniHelper::getMethodInfo(minfo,  
  17.                     "com/zhycheng/tt/CppCallJava""dosomething","()V");  
  18.             if(isHave)  
  19.             {  
  20.                 CCLog("jni:dosomething 此函数存在");  
  21.                 minfo.env->CallVoidMethod(obj, minfo.methodID);  
  22.             }  
  23.             else  
  24.             {  
  25.                 CCLog("%s","dosomething isn't exist");  
  26.             }  
  27.         }  
  28.         CCLog("jni-java函数执行完毕");  
  29.     #endif  

最后注意:C++调用的Java方法都是在非UI线程中。
0 0