Cocos2d-x的跨平台性很强大,但是偶尔也需要平台的原生API结合。

C++在Win32平台下简单的很,C++可以直接用MFC或者调用Win32API。

Ios在XCode下直接就能C++和OC混编。

而Android又一次悲剧了,C++既不是Android的原生语言,也没有IDE可以混编。。。

我们只好通过jni来搞。

Cocos2d-x 给我们提供了JniHelper类(良心!)。头文件 #include "platform/android/jni/JniHelper.h"。通过这个类我们可以很简单的调用Java代码的类方法,这里引用一下Cocos2d-x官方文档:

最重要的两个方法:

getStaticMethodInfo、getMethodInfo
getStaticMethodInfo
getStaticMethodInfo调用Java静态方法的方法:
getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode)
第一个参数为JniMethodInfo,为一个容器类,表示当前调用的方法
第二个参数为调用Java方法类的全名
第三个参数为调用java的方法名,也就是参数为方法的参数类型
java与Jni对应的参数类型如下:
ava类型
对应的签名
boolean
Z
byte
B
char
C
short
S
int
I
long
J
float
F
double
D
void
V
Object
Ljava/lang/String
Array
Ljava/lang/String
第四个参数为返回类型
getMethodInfo
getMethodInfo类似与第一个函数,只是对应非静态函数;此函数主要用于获取Java定义的类非静态函数是否存在,返回bool;
JniMethodInfo
此类型主要用户保存类结构体,可以通过JniHelper类的getStaticMethodInfo函数实例化JniMethodInfo对象,从而使用实例的env属性调用CallStaticVoidMethod,CallVoidMethod,CallStaticIntMethod等函数进行对保存的类结构调用函数;
示例代码:
JniMethodInfo t;
bool isHave = JniHelper::getStaticMethodInfo(t,
"com/weibo/test/WeiboHelper", //需要调用的Java文件
"toast",//调用的方法名
"()V");//参数
文档就这些。。有点不够用,所以我就是来补充的。。。
到这里只是引用了目标方法,调用静态方法需要通过 CallStatic**Method(classID, methodID) 函数,其中 “**” 可以是Int等基本类型、Object、Void。
调用非静态方法就有对应的Call**Method(classID, methodID) 函数。
最后是示例:
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo,
"com/red/test/Test",
"cppTest",
"()V");
if (isHave)
{
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
}

Android JNI c/c++调用java 无需新建虚拟机

近期通过研究SDL源码 得出android JNI  c/c++调用java 无需新建虚拟机: 具体步骤如下 第一步获得:两个参数 JNIEnv和jclass void Java_com_Test_A ...

JNI C反射调用java方法

前面记录了调用C的学习笔记,现在来记录一下C反射调用Java的笔记.JNI开发学习之调用C方法 Android开发中调用一个类中没有公开的方法,可以进行反射调用,而JNI开发中C调用java的方法也是 ...

JNI中C调用Java方法

背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...

Music Studio项目心得--JNI实现C++调用JAVA

这个项目是我參加内蒙古挑战杯的比赛项目,因为时间关系,我没时间实现OpenOMR开源项目由JAVA全然向C++的转换,经过我半个多月的尝试,我将OpenOMR中的1/3的代码改写成C++,只是非常快我 ...

Android与JNI(三) ---- c++调用java(转载)

源码下载:JniDemo JNI就是Java Native Interface, 即可以实现Java调用本地库, 也可以实现C/C++调用Java代码, 从而实现了两种语言的互通, 可以让我们更加灵活 ...

Android JNI中C调用Java方法

背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...

JNI由浅入深_7_c调用Java方法一

1.在Java中声明方法 /** * javah -encoding utf-8 -jni com.exam ...

jni中调用java方法获取当前apk的签名文件md5值

相应的java方法: void getsign(Context context) throws Exception { PackageInfo localPackageInfo = context.g ...

JNI学习笔记_C调用Java

一.笔记 1.C调用Java中的方法,参考jni.pdf pg97可以参考博文:步骤: a. 创建 ...

随机推荐

Spring MVC学习笔记——登录和异常处理

1.在WEN-INF文件夹下面,添加一个login.jsp文件

yii2 框架的 save() 方法 执行模式条件。

save() 方法会调用 insert() 和 update() 中的一个, 用哪个取决于当前 AR 对象是不是新对象(在函数内部,他会检查 yii\db\ActiveRecord::isNewRe ...

shell note

1 输出重定向:ll > aaa 将输出内容 添加到aaa文件中 ll >> aaa将输出内容追加到aaa中 ll &>> abc 将输出内容不论正确或错误都保存 ...

只有图片拼接的html页面图片之间有白条的解决方法

有时候会有这样的页面,整个页面也就是几张切好的图片组成,但是把这些图片使用代码拼接好,又总会出现图片间有白条的问题,如下图: 解决方法:给图片的父容器添加 line-height: 0; 就好了,因为 ...

Android之智能问答机器人

本文主要利用图灵机器人的接口,所做的一个简单的智能问答机器人 实现 由于发送与接收消息都是不同的listView,所以要用有两个listVeiw的布局文件 接收消息布局文件 <?xml vers ...

Android AndroidManifest 清单文件以及权限具体解释

每一个Android应用都须要一个名为AndroidManifest.xml的程序清单文件,这个清单文件名称是固定的而且放在每一个Android应用的根文件夹下.它定义了该应用对于Android系统来 ...

How to manage and balance &OpenCurlyDoubleQuote;Huge Data Load” for Big Kafka Clusters---reference

1. Add Partition Tool Partitions act as unit of parallelism. Messages of a single topic are distribu ...

IM 融云 之 初始化及登录

融云是没有用户体系的,用户登录需要获取token,测试时可以使用网站提供的接口,但是正式是要通过服务器调用专门的接口从融云获取的.并且我没看到融云的重连机制,不知道是否已在SDK内部实现. 现在看来, ...

转载---关于Spring的69个面试问答

链接:http://www.importnew.com/11657.html 目录 Spring概述 依赖注入 Spring Beans Spring注解 Spring的对象访问 Spring面向切面 ...

linux局域网内挂载其它操作系统目录

一.linux挂载windows 1.windows目录打开共享: 2.mount -t cifs -o username=admin***tor,password=abc //192.168.*** ...