static bool getStaticmethodInfo(JniMethodInfo &methodinfo,const char *classname,const char *methodname,const char *paramCode);static bool getmethodInfo(JniMethodInfo &methodinfo,const char *paramCode);实现上我们只需要使用上面这两个接口,就可以获取java类的所有函数信息了。JNI环境的获取、各种错误处理都已经在这两个接口实现中封装好了。先上代码,再来依次讲解每个参数的意义和使用方法:
//函数信息结构体 JniMethodInfo minfo; bool isHave = JniHelper::getStaticmethodInfo(minfo,/*JniMethodInfo的引用*/ "com/omega/MyApp",/*类的路径*/ "getJavaActivity",/*函数名*/ "()Ljava/lang/Object;");/*函数类型简写*/ jobject activityObj; if (isHave) { //CallStaticObjectMethod调用java函数,并把返回值赋值给activityObj activityObj = minfo.env->CallStaticObjectMethod(minfo.classID,minfo.methodID); }OK,很简单。上面的代码,就是使用JNI在C++中调用java类静态函数的典型使用方法。只有两步: 获取java函数的信息,classID、methodID等等 选择jnienv中的接口,进行函数调用 getStaticmethodInfo参数详解 getmethodInfo和getStaticmethodInfo这两个接口的参数一样,意义也相同,详解如下: JniMethodInfo &methodinfo JniMethodInfo对象的引用,函数执行中会把jnIEvn、classID、methodID写入到引用中。 const char *classname 类的路径,把类的完整包名写全,用法如以上代码。 const char *methodname 函数名,函数名写上就行了。 const char *paramCode 函数类型简写,它的格式为:(参数)返回类型。如:无参数,voID返回类型函数,其简写为 ()V java中的类型对应的简写如下:
参数类型 | 参数简写 |
boolean | Z |
byte | B |
char | C |
short | S |
int | I |
long | J |
float | F |
double | D |
voID | V |
Object | Ljava/lang/Object; |
String | Ljava/lang/String; |
Array | [ |
多参数的函数
如果函数有多个参数,直接把简写并列即可。注意Object与String型参数简写结尾的分号,示例: (IIII)V ==> voID fun(int a,int b,int c,int d) (ILjava/lang/String;I)Ljava/lang/String; ==> string fun(int x,String a,int y) (ILjava/lang/String;[I)J ==> long fun(int n,String s,int[] arr) 通过jnienv进行函数调用 JNIEvn有一系列的CallStatic[返回类型]Method、Call[返回类型]Method接口,需要针对不同的函数返回类型选择调用。[返回类型]以函数返回类型的不同,对应不同的函数名。例如: CallStaticVoIDMethod ——voID; CallVoIDMethod ——voID 其对应关系如下: 函数名jint jX = 10;jint jY = 10;minfo.env->CallStaticVoIDMethod(minfo.classID,minfo.methodID,jX,jY);参数类型转换关系如下: C++类型
Jstring jmsg = minfo.env->NewStringUTF("http://www.baIDu.com");minfo.env->CallStaticVoIDMethod(minfo.classID,jmsg);非静态函数的调用 非静态函数的调用与静态函数的调用类似,但是需要通过一个静态函数获取java类对象。
JniMethodInfo info; bool ret = JniHelper::getStaticmethodInfo(info,"org/cocos2dx/cpp/TestJniHelper","getobj","()Ljava/lang/Object;"); //先获得类的对象,然后用这个对象去调用它的非静态函数 jobject jobj; if(ret) { log("call static method"); jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID); } //getmethodInfo判断java定义的类非静态函数是否存在,返回bool bool re = JniHelper::getmethodInfo(info,"func","()V"); if(re) { log("call no-static method"); //非静态函数调用的时候,需要的是对象,所以与静态函数调用的第一个参数不同 info.env->CallVoIDMethod(jobj,info.methodID); }总结
以上是内存溢出为你收集整理的[cocos2dx]在cocos2dx中通过Jni实现Java与C++的互相调用(一)全部内容,希望文章能够帮你解决[cocos2dx]在cocos2dx中通过Jni实现Java与C++的互相调用(一)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)