【IOS-COCOS2D-X 游戏开发之十三】详细讲解在XCODE中利用预编译并通过JNI调用ANDROID的JAVA层代码(COCOS2DX里访问调用ANDROID函数)!
此函数主要用于获取Java定义的类静态函数是否存在,返回bool;
此函数有3个参数:
第一参数: minfo - JniMethodInfo 类型,后面详细说;
第二个参数:类的路径。
第三个参数:方法名(第一参数类中的函数)
第四个参数:(参数)返回类型
关于第一个和第二个参数都比较容易理解,那么第三个参数需要重点介绍一下;例如你在Java中定义一个如下函数 public void helloJni(){};
那么getStaticMethodInfo函数第三个参数你应该传入 “()V” 表示此函数无参无返回值!
如果有这么一个函数: public int helloJni(int _int){return 823};
那么getStaticMethodInfo函数第三个参数你应该传入 “(I)I” 表示此函数需要传入一个int类型的参数并且返回一个int类型!
大概说两个童鞋们应该基本理解了,那么下面详细写一些对照表,留给大家对照;
参数、返回值样式对照表:
这里的签名指的就是getStaticMethodInfo函数第三个参数中传入的样式;
2. getMethodInfo 类似与第一个函数,只是对应非静态函数;此函数主要用于获取Java定义的类非静态函数是否存在,返回bool;
JniMethodInfo 类:
此类型主要用户保存类结构体,可以通过JniHelper类的getStaticMethodInfo函数实例化JniMethodInfo对象,从而使用实例的env属性调用CallStaticVoidMethod,CallVoidMethod,CallStaticIntMethod等函数进行对保存的类结构调用函数;
常用的函数如下:(静态系列函数)
1. CallStaticVoidMethod(classID,methodID);
2. CallStaticIntMethod(classID,methodID);
3~(n-1) ……省略掉,童鞋们一看就明白;
n. CallStaticObjectMethod(classID,methodID);
带参数的函数:(如int类型)
CallStaticVoidMethod(classID,methodID,int _int);
非静态系列函数:
1. CallVoidMethod(jobj,methodID);
2. CallIntMethod(jobj,methodID);
3~(n-1) ……省略掉,童鞋们一看就明白;
n. CallStaticObjectMethod(jobj,methodID);
带参数的函数:(如int类型)
CallVoidMethod(classID,methodID,int _int);
这里讲解下几个参数函数:
1. classID: 类ID , JniMethodInfo 对象包含此属性;
2. methdID: 方法ID,JniMethodInfo 对象也包含此属性;
3. jobj : java中Object类型,如自定义类,String…
非静态函数调用的时候,需要的是对象,所以与静态函数调用的第一个参数不同;
那么既然能调用Java的函数,那就能得到函数返回值,但是这里我们得到的返回值书写类型如下:
譬如返回int 类型,在Xcode中使用 jint 这种形式,更多形式如下:
int - jint
…省略,大家一看就懂得;
object - jobject
估计有的童鞋已经晕了,没关系,下面Himi写了一些例子代码,结合来看就一目了然啦。
Xcode中先导入如下头文件:
////静态函数示例1.无参数,无返回值---------------------------------$$$$$$----------------------------- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 JniMethodInfo minfo;//定义Jni函数信息结构体
bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/ai/ommr/OhMonsterMR4Android","testFun", "()V"); if (!isHave) {
//静态函数示例2.有参数,无返回值------------------------------$$$$$$$-------------------------------- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 JniMethodInfo minfo;//定义Jni函数信息结构体
"com/ai/ommr/OhMonsterMR4Android", "testFunWithInt","(I)V"); if (!isHave) {
//静态函数示例3.有参数,有返回值--------------------------------$$$$$$$-------------------------------- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 JniMethodInfo minfo;//定义Jni函数信息结构体 //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数 bool isHave = JniHelper::getStaticMethodInfo(minfo,
"com/ai/ommr/OhMonsterMR4Android","testFunWithIntAndRtn","(I)I");
bool isHave = JniHelper::getStaticMethodInfo(minfo_ty, "com/ai/ommr/OhMonsterMR4Android", "testFunWithInt", "(I)V");
minfo_ty.env- gt;CallStaticVoidMethod(minfo_ty.classID, minfo_ty.methodID,_int);
bool isHave = JniHelper::getStaticMethodInfo(minfo, "com/ai/ommr/OhMonsterMR4Android","testFunWithStringAndRtn","(I)Ljava/lang/String;");
jobj = minfo.env- gt;CallStaticObjectMethod(minfo.classID, minfo.methodID,823);
"com/ai/ommr/OhMonsterMR4Android", //类的路径
"()Ljava/lang/Object;"); //括号里的是参数,后面的是返回值。
"com/ai/ommr/OhMonsterMR4Android", //类的路径
相关文章
- Java多线程详解_java支持多线程
- Java详解:淘宝秒杀脚本java
- 中级java笔试题_Java中级面试题合集[通俗易懂]
- java怎么运行_怎样启动JAVA?「建议收藏」
- 在线学习Java的几个网站,别再盲目学习java了![通俗易懂]
- java环境_Java基础篇——环境配置
- java extends runtimeexception_Java中RuntimeException和Exception的区别
- java webservice实现_JAVA WebService的实现方式
- android sdk安装过程,图文详解Android 3.0 SDK安装教程
- java 文件上传到服务器_Java上传文件到服务器端的方法「建议收藏」
- Java生成随机数组_java生成唯一数字
- Java学习-如何编译适配java版本的jar包
- 【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )
- 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
- 【错误记录】Android Studio 4.2.1 编译报错 ( 设置支持的 Java 和 Kotlin 版本 | java.lang.BootstrapMethodError )
- 【Android 逆向】函数拦截原理 ( 可执行程序基本结构 | GOT 全局偏移表 | 可执行程序函数调用步骤 )
- 【Android Gradle 插件】Module 目录下 build.gradle 配置文件 ( android 闭包块配置 | AppExtension 扩展类型参考文档 )
- 【Android Gradle 插件】Gradle 扩展属性 ③ ( 为任意对象设置扩展属性 | 扩展属性定义方式 )
- Android开发艺术探索(一)——Activity的生命周期和启动模式详解手机开发
- 数据库Java连接MySQL数据库实现数据添加(java添加mysql)
- MSSQL与Java的数据库连接实践(mssql连接java)
- 在Linux上实现Java程序的运行(linux运行java程序)
- Android键盘显示与隐藏代码