首先大概的介绍一个类 JniHelper ;
此类主要用于Jni与Java层之间的相互访问的作用,那么此类的常用的一些函数这里首先介绍下,否则直接上代码不太容易吸收 ;
JniHelper 类常用函数:
1. getStaticMethodInfo (四个参数,bool 返回值)
使用示例代码:
boolisHave = JniHelper::getStaticMethodInfo(minfo,"com/zwl/test/JniTest","testFun","()V");
此函数主要用于获取Java定义的类静态函数是否存在,返回bool;
此函数有3个参数:
第一参数: minfo ->JniMethodInfo 类型;
第二个参数:类的路径。
第三个参数:方法名(第一参数类中的函数)
第四个参数:(参数)返回类型
关于第一个和第二个参数都比较容易理解,那么第三个参数需要重点介绍一下;例如你在Java中定义一个如下函数 public static void testFun(){};
那么getStaticMethodInfo函数第三个参数你应该传入 “()V” 表示此函数无参无返回值!
如果有这么一个函数: public static int testFun(int _int){return 823};
那么getStaticMethodInfo函数第三个参数你应该传入 “(I)I” 表示此函数需要传入一个int类型的参数并且返回一个int类型!
大概说两个应该基本理解了,那么下面详细写一些对照表,留给大家对照;
下面再贴个完整例子:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfo minfo;
//--------------
//下面需要修改
//--------------
bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/nq/pandaKeeper/pK","getStr","(Ljava/lang/String;)V");
if (isHave)
{
CCLog("..............test");
jstring str = minfo.env->NewStringUTF( "Hello from JNI From Callback!");
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,str);
}else{
CCLog("do not exist----------");
}
CCLog("JniMethodInfo over++++++++");
#endif
经常会传string类型的值,上面的类型注意是
jstring
android下代码
public static void getStr(String s) {
System.out.println(s);
}