Cocos2d-x中JniHelper详解
JniHelper.h 头文件在引擎目录platform/android/jni下。
结构体定义如下:
typedef struct JniMethodInfo_
{
JNIEnv * env;
jclass classID;
jmethodID methodID;
} JniMethodInfo;
通过使用第一个参数env来调用java的函数。
常用的接口有两个:
static bool getStaticMethodInfo(JniMethodInfo &methodinfo,
const char *className,
const char *methodName,
const char *paramCode);
static bool getMethodInfo(JniMethodInfo &methodinfo,
const char *className,
const char *methodName,
const char *paramCode);
使用示例:
bool GPSProxy::requestLocation()
{
bool ret = false;
JniMethodInfo method_info;
/获取gps管理器对象
jobject gps_manager = (jobject)getGPSManager();
if (gps_manager == NULL)
{
return false;
}
//获取GPS是否已打开函数
//method_info为输出参数。"devices/GPSManager"为类路径。"isOpened"为函数名。()Z为函数参数和返回值,表示无参数,boolean返回值类型
ret = JniHelper::getMethodInfo(method_info, "devices/GPSManager", "isOpened", "()Z");
if(!ret)
{
return false;
}
//GPS未打开,则打开GPS
bool is_opened = method_info.env->CallBooleanMethod(gps_manager, method_info.methodID);
if(!is_boolean)
{
//非静态函数的调用
ret = JniHelper::getMethodInfo(method_info, "devices/GPSManager", "openGPS", "()V");
if(!ret)
{
return false;
}
//启动设备更新
method_info.env->CallVoidMethod(gps_manager, method_info.methodID);
}
}
void* GPSProxy::getGPSManager()
{
s_gps_manager = NULL;
//获取设备管理器对象函数
JniMethodInfo method_info;
//静态函数的调用
bool ret = JniHelper::getStaticMethodInfo(method_info, "devices/GPSManager", "getInstance", "()Ljava/lang/Object;");
if (!ret)
{
return NULL;
}
//创建设备管理器对象
jobject gps_manager = method_info.env->CallStaticObjectMethod(method_info.classID, method_info.methodID);
if (gps_manager == NULL)
{
return NULL;
}
s_gps_manager = (void*)gps_manager;
return s_gps_manager;
}
附:java中类型对应简写:
类型 | 简写 |
---|---|
boolean | Z |
byte | B |
char | C |
short | S |
int | I |
long | J |
float | F |
double | D |
void | V |