JNI基本经验总结

<1>知识点:JNI调用基本原理。
第一步:通过JNI获取Java虚拟机,再获取当前程序的JNI环境,
        通过JNI环境获取需要调用的Java类信息(比如获取到GunStreet这个类的一个实例)
第二步:再获取需要调用的Java类中的函数信息。
        再通过JNI环境调用,使用类信息、函数信息,调用相应的Java函数。

总结:试想,你怎样才能具体识别到一个Java类中的方法? 我想这样就可以:
1,知道这个方法属于哪个类。
2,知道这个方法的各种信息,包括:返回值,参数。

因此总结来说,要调用一个Java类中的一个返回值为int类型的方法,
那么第一步获取该GunStreet类的一个实例(通过该实例获取类信息嘛),
第二步就是通过类信息和参数信息调用普通方法。
固定的模式如下:
(JniHelper::getStaticMethodInfo(minfo, "com/qingxue/game/GunStreet", "getInstance", "()Ljava/lang/Object;"))   
jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);   
JniHelper::getMethodInfo(minfo, "com/qingxue/game/GunStreet", "interval", "()I")    
conLoginDays = minfo.env->CallIntMethod(jobj, minfo.methodID); 

第一步包名要修改。
第二步不变
第三步包名,函数名字,返回值名字需修改。
第四步可能要传递参数

<2>知识点:JniHelper                       
A,JNI调用复杂的操作被封装在JniHelper中了。

B,分别对应于获取静态方法(获取类信息)和普通方法(获取要调用函数信息)信息的2个函数。
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);

C,例子参考每日登陆实现吧。

你可能感兴趣的:(JNI基本经验总结)