Cocos2d-x与Android利用JNI相互调用

1.背景知识

1.1什么是JNI

JNI是Java Native Interface的简写,简单来说,就是一种JAVA和C++之间相互调用的一套接口。利用JNI可以在JAVA代码层(manager code)调用C++代码层(native code)的函数,反之亦可。

如果你之前并不熟悉JNI,可以通过官方文档:Java Native Interface Specification ( http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)先来了解一下。

英文不好的同学,可以看看这篇博客(http://wiki.jikexueyuan.com/project/deep-android-v1/jni.html)

1.2 为什么要用JNI

Cocos2d-x作为一种跨平台的开源游戏引擎,其特点是一次编写,到处部署。如果部署到Android平台,我们可以利用JNI来调用Android的一些类库和控件,加个Android原生对话框什么的。更重要的是,如果项目里有很多组件是用JAVA编写的,我们应该尽量使用现有的组件,避免重复的制造轮子。

应当指出,Cocos2d-x可以调用Android的控件,但是不应该过分依赖这一点,唯一用到这一功能的情景,是引擎实在没法实现,从解耦的角度考虑,界面逻辑应当尽量放在Cocos当中来做。

2.Cocos2d-x调用JAVA代码

Cocos为我们封装了一些JNI调用的接口,这个类叫JniHelper(其实JAVA自己也提供了JNI调用的接口类,叫JniHelp,这两个类没什么差别),这个类的位置在[cocos安装路径]\cocos\platform\android\jni

这里写图片描述

在Cocos中用JNI调用JAVA程序时,jni.h这个头文件是必须的,好在JniHelper.h中已经帮我们包含了,所以我们只需要包含JniHelper.h这个头文件就可以了。

所以,在需要调用JNI的类中,需要加入

    #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    #include "platform/android/jni/JniHelper.h"

    #endif

条件编译,是用来说明这个东西是Android平台上用到的。

JniHelper.h当中还包含一个相当重要的结构体:JniMethodInfo,看名字就猜到了,这个结构体是用来定位调用的JAVA方法的,来看看这个结构体的定义

    typedef struct JniMethodInfo_
    {
        JNIEnv *    env;
        jclass      classID;
        jmethodID   methodID;
    } JniMethodInfo;

classID和methodID很好理解,分别代表类和方法,这样就可以定位到具体的方法了。env稍微有点复杂,它表示一个线程相关的结构体,里面保存的是JNI函数指针,不能跨线程访问,其实也不用管这个变量究竟代表什么意思,用起来十分简单。

那么下一个问题是怎么初始化这三个成员变量,或者说怎么注册JAVA方法。

举个例子,待调用的JAVA方法,位于org.cocos2dx.cpp包中,类名叫TestJni,待调用的方法是func1

这里写图片描述

(关于如何将Cocos项目部署到Eclipse上,参考我前一篇博客:http://blog.csdn.net/sgn132/article/details/50481923)

TestJni.java的代码十分简单,注意这里func1方法是静态函数,具体代码如下:

    package org.cocos2dx.cpp;

    import android.util.Log;

    public class TestJni {
   
        public static void func1(){
            Log.d("success","java jni called succeed");
        }
    }

然后打开Cocos项目,我这里使用VS2015作为开发环境的,cocos版本是v3.8.1,在一个按键响应方法里,添加调用JNI的代码

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    JniMethodInfo info;
    //getStaticMethodInfo判断java定义的静态函数是否存在,返回bool
    bool ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func1","()V");
    if(ret)
    {
        log("call void func1() succeed");
        //传入类ID和方法ID,小心方法名写错,第一个字母是大写
        info.env->CallStaticVoidMethod(info.classID,info.methodID);
    }
#endif
  • getStaticMethodInfo是注册函数
    他有4个参数,前三个很好理解,用来定位JAVA方法,最后一个参数一般称为签名,是用来表示调用的JAVA方法的传递参数和返回值类型的。
  • CallStaticVoidMethod是调用函数
    这个函数也不用多说了,使用来调用指定JAVA方法的。

2.1 JNI怎么传递自定义数据类型

2.1.1 参数、返回值类型组成的字符串——签名

首先要提的是JNI的签名机制,签名其实就是函数的参数类型和返回值类型共同组成的字符串,之所以要有签名机制,是因为C++是允许函数重载的,单靠函数名无法准确定位函数的入口,还需要函数的参数信息。

JNI的规范签名格式是:

(参数1类型标示参数2类型标示...参数n类型标示)返回值类型标示。

举个栗子:
JAVA中函数定义为

    void play(String singer,String album)

对应的签名

    (Ljava/lang/String;Ljava/lang/String;)V

其中L表示引用类型,后面跟的是包名,需要把”.“换成”/“,V表示void。

这里给出标示类型对照表:

标示类型 Java类型
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L/java/lang/String; S
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cocos2d-x js是一个开源的游戏开发引擎,用于开发跨平台的2D游戏,它使用JavaScript作为脚本语言。以下是对cocos2d-x js的回答。 cocos2d-x js是cocos2d-x引擎的JavaScript版本,它继承了cocos2d-x引擎强大的功能和性能,同时提供了使用JavaScript编写游戏的便利性。 cocos2d-x js通过使用JavaScript脚本语言进行游戏开发,使得开发者可以更加方便地编写游戏逻辑和动作表现。JavaScript是一种简单易用的脚本语言,对于不熟悉复杂编程语言的开发者来说,使用JavaScript进行游戏开发会更加容易上手。 cocos2d-x js提供了丰富的游戏功能和API,包括精灵动画、物理引擎、碰撞检测、场景管理等,这些功能可以帮助开发者快速构建2D游戏。同时,cocos2d-x js还提供了跨平台的支持,可以将游戏轻松移植到不同的平台上,如iOS、Android、Windows等。 除了基本的功能和API,cocos2d-x js还支持插件和扩展,开发者可以根据自己的需求进行扩展和定制,以满足游戏的特殊需求。 总结来说,cocos2d-x js是一个强大而灵活的游戏开发引擎,它提供了使用JavaScript进行游戏开发的便利性,同时具备跨平台的支持和丰富的功能和API。无论是初学者还是有经验的开发者,都可以通过cocos2d-x js来快速构建出高质量的2D游戏。 ### 回答2: Cocos2d-x是一款强大的跨平台游戏开发引擎,具有许多独特而且强大的功能。cocos2d-x js篇是Cocos2d-x引擎的JavaScript版本,它可以让开发者使用JavaScript编写游戏逻辑和界面。 使用Cocos2d-x js篇,开发者可以轻松地创建2D游戏,并在多个平台上运行,如iOS、Android、Windows和Web。这意味着开发者只需编写一次代码,就可以发布到多个平台,大大提高了开发效率。 cocos2d-x js篇提供了丰富的API和功能,使得开发复杂的游戏变得轻松。它包括图形渲染、动画系统、物理引擎、碰撞检测、音频管理等功能,开发者可以利用这些功能创建出丰富多样的游戏体验。 此外,cocos2d-x js篇还支持现代开发工具和技术,如可视化编辑器Cocos Creator,可实时调试和热更新等。开发者可以使用Cocos Creator创建游戏场景、编辑动画、创建粒子效果等。同时,Cocos2d-x js篇还集成了调试工具,方便开发者进行错误排查和优化。 总之,Cocos2d-x js篇是一个非常强大且灵活的游戏开发引擎。它提供了广泛的功能和工具,使得开发者能够快速创建高质量的2D游戏,并在多个平台上发布。无论是初学者还是有经验的开发者,都可以通过Cocos2d-x js篇轻松实现独特而丰富的游戏体验。 ### 回答3: Cocos2d-x js是一种使用Javascript编写的跨平台游戏开发框架。它是基于Cocos2d-x引擎的扩展,可以在多个平台上运行,包括iOS、Android、Windows和Mac等。 Cocos2d-x js提供了丰富的游戏开发工具和功能,可以帮助开发人员轻松创建高质量的游戏应用。它具有优秀的性能和灵活性,并且能够快速部署到各种平台上。 使用Cocos2d-x js,开发人员可以使用熟悉的Javascript语言进行游戏开发,而无需学习其他编程语言。它提供了一系列API和组件,例如精灵、动作、节点和场景等,以简化游戏的创建和管理过程。 此外,Cocos2d-x js还提供了多种功能,如物理引擎、碰撞检测、音效播放和动画效果等,可以帮助开发人员实现各种游戏特效和交互效果。 Cocos2d-x js还支持一些常用的开发模式和工具,如游戏UI编辑器、游戏调试器和性能分析器等,方便开发人员进行游戏开发和调试。 总之,Cocos2d-x js是一款功能强大、易于使用并且跨平台的游戏开发框架。无论是新手还是经验丰富的开发人员,都可以借助它来创建出令人印象深刻的游戏应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值