#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
"androidplatform!"
);
JniMethodInfoinfo;
//getStaticMethodInfo判断java定义的静态函数是否存在,返回bool
);
(ret)
);
//传入类ID和方法ID,小心方法名写错,第一个字母是大写
}
//调用的函数有返回值
"func2"
"()I"
);
(ret)
{
"callintfunc2()succeed"
);
//返回的int值,用jint类型来接收
jintiret=info.env->CallStaticIntMethod(info.classID,info.methodID);
"func2的返回值是%d"
}
//调用的函数有参数有返回值,这里有坑,注意Ljava/lang/String;后边的;
"func3"
"(I)Ljava/lang/String;"
);
(ret)
{
"callintfunc3(int)succeed"
);
//java层的类类型对应的是jobject,把需要传递的参数写到调用函数的后边
jobjectjobj=info.env->CallStaticObjectMethod(info.classID,info.methodID,1438);
}
//参数和返回值都是类类型
"func4"
"(Ljava/lang/String;)Ljava/lang/String;"
);
(ret)
{
"callstringfunc4(string)succeed"
);
jobjectpara=info.env->NewStringUTF(
"haha"
);
jstringjstr=(jstring)info.env->CallStaticObjectMethod(info.classID,para);
//使用jstring2string函数将返回的jstring类型的值转化为c++中的string类型
std::stringtext=JniHelper::jstring2string(jstr);
"%s"
}
//如果函数需要的参数是俩个或者是多个,可以采用如下的写法
"(II)I"
);
(ret)
{
"callintfunc5(inta,intb)succeed"
);
"returnvalueis%d"
}
上边的代码主要还是那俩个函数调用的说明,getStaticMethodInfo的第四个参数如果是类类型,注意要使用的签名,后边的分号也要加,如果参数有多个,直接连起来书写就可以了。使用CallStaticMethod调用的时候注意一下参数和返回值的类型,传递参数的时候直接写到函数的后边,但是参数类型要正确,返回值使用对应的类型来接受,这个类型就是前面加一个j,比如java层返回的类型是int,那接受的类型就是jint,java层返回object,接受类型就是jobject。
以上是调用java的静态函数,接下来是非静态函数的调用。我将C++的代码和java的代码都贴出来。
17
JniMethodInfoinfo;
"org/cocos2dx/cpp/TestJniHelper"
"getObj"
"()Ljava/lang/Object;"
);
//先获得类的对象,然后用这个对象去调用它的非静态函数
jobjectjobj;
(ret)
"callstaticmethod"
);
jobj=info.env->CallStaticObjectMethod(info.classID,info.methodID);
}
//getMethodInfo判断java定义的类非静态函数是否存在,返回bool
re=JniHelper::getMethodInfo(info,monospace!important; font-size:1em!important; min-height:inherit!important; color:blue!important; background:none!important">"func"
);
(re)
{
"callno-staticmethod"
//非静态函数调用的时候,需要的是对象,所以与静态函数调用的第一个参数不同
info.env->CallVoidMethod(jobj,info.methodID);
}
|
16
TestJniHelper
private
TestJniHelperinstance=
new
TestJniHelper();
ObjectgetObj()
{
instance;
}
func()
"funciscalled"
}
因为调用的是非静态的函数,所以我们使用CallVoidMethod的时候就不能传入类ID了,要传入一个对象,告诉它调用的是哪个对象的方法,所以为了有这么一个对象,我们就得先调用一个静态的方法来返回这个对象,然后用这个对象作为参数调用非静态函数。好了,关于Jni的基本用法就是这样了,只是本人的一点拙见,没有了解过的可以看看,如果是大神就绕路吧。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|
|