Cocos2d-x的跨平台性很强大,但是偶尔也需要平台的原生API结合。
C++在Win32平台下简单的很,C++可以直接用MFC或者调用Win32API。
Ios在XCode下直接就能C++和OC混编。
而Android又一次悲剧了,C++既不是Android的原生语言,也没有IDE可以混编。。。
我们只好通过jni来搞。
Cocos2d-x 给我们提供了JniHelper类(良心!)。头文件 #include "platform/android/jni/JniHelper.h"。通过这个类我们可以很简单的调用Java代码的类方法,这里引用一下Cocos2d-x官方文档:
最重要的两个方法:
getStaticMethodInfo、getMethodInfo
getStaticMethodInfo
getStaticMethodInfo调用Java静态方法的方法:
getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode)
第一个参数为JniMethodInfo,为一个容器类,表示当前调用的方法
第二个参数为调用Java方法类的全名
第三个参数为调用java的方法名,也就是参数为方法的参数类型
java与Jni对应的参数类型如下:
ava类型 | 对应的签名 |
---|---|
boolean | Z |
byte | B |
char | C |
short | S |
int | I |
long | J |
float | F |
double | D |
void | V |
Object | Ljava/lang/String |
Array | Ljava/lang/String |
- 第四个参数为返回类型
getMethodInfo
getMethodInfo类似与第一个函数,只是对应非静态函数;此函数主要用于获取Java定义的类非静态函数是否存在,返回bool;
JniMethodInfo
此类型主要用户保存类结构体,可以通过JniHelper类的getStaticMethodInfo函数实例化JniMethodInfo对象,从而使用实例的env属性调用CallStaticVoidMethod,CallVoidMethod,CallStaticIntMethod等函数进行对保存的类结构调用函数;
示例代码:
JniMethodInfo t;
bool isHave = JniHelper::getStaticMethodInfo(t,
"com/weibo/test/WeiboHelper", //需要调用的Java文件
"toast",//调用的方法名
"()V");//参数
文档就这些。。有点不够用,所以我就是来补充的。。。
到这里只是引用了目标方法,调用静态方法需要通过 CallStatic**Method(classID, methodID) 函数,其中 “**” 可以是Int等基本类型、Object、Void。
调用非静态方法就有对应的Call**Method(classID, methodID) 函数。
最后是示例:
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo,
"com/red/test/Test",
"cppTest",
"()V"); if (isHave)
{
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
}