Cocos2d-x调用Java

cocos2dx与java之间的相互调用 为cocos2dx接移动sdk的时候 常常要处理回调函数 需要相互调用 立即下载

本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】原文链接: http://www.himigame.com/android-game/725.html

很多看过之前Himi的【iOS-cocos2d-X 游戏开发之七】整合Cocos2dX的Android项目到Xcode项目中,Xcode编写&编译代码,Android导入打包运行即可! 博文的童鞋都在问我如何在Xcode中能调用Java的函数,比如在Android端需要加入广告、支付、等第三方平台或者单独处理的一些代码;那么本篇Himi分享如何在Cocos2dx中访问调用Android的Java层函数;

首先Himi大概的介绍一个类 JniHelper ;

此类主要用于Jni与Java层之间的相互访问的作用,那么此类的常用的一些函数这里首先介绍下,否则直接上代码不太容易吸收 ;

JniHelper 类常用函数:

 1.  getStaticMethodInfo    (四个参数,bool 返回值)

使用示例代码:

bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/ai/ommr/OhMonsterMR4Android","testFun","()V");


此函数主要用于获取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中先导入如下头文件:

//使用预编译,对当前平台为Android时才会导入如下头文件
 
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include <android/log.h>
#endif


 

示例代码段1:

Xcode 代码:

////静态函数示例1.无参数,无返回值---------------------------------$$$$$$-----------------------------
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    JniMethodInfo minfo;//定义Jni函数信息结构体
    //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
    boolisHave = JniHelper::getStaticMethodInfo(minfo,"com/ai/ommr/OhMonsterMR4Android","testFun","()V");
 
    if(!isHave) {
        CCLog("jni:此函数不存在");
    }else{
        CCLog("jni:此函数存在");
        //调用此函数
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
    }
    CCLog("jni-java函数执行完毕");
#endif


Android(Java) 代码:

// 静态函数示例1.无参数,无返回值
public static void testFun() {
    Log.e("Himi","静态函数示例1.无参数,无返回值");
}


运行截图:

 

示例代码段2:

Xcode 代码:

//静态函数示例2.有参数,无返回值------------------------------$$$$$$$--------------------------------
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    JniMethodInfo minfo;//定义Jni函数信息结构体
    //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
    boolisHave = JniHelper::getStaticMethodInfo(minfo,
                                                "com/ai/ommr/OhMonsterMR4Android","testFunWithInt","(I)V"); 
 
    if(!isHave) {
        CCLog("jni:此函数不存在");
    }else{
        CCLog("jni:此函数存在");
        //调用此函数
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,823);
    }
    CCLog("jni-java函数执行完毕");
#endif


 

Android(Java) 代码:

// 静态函数示例2.有参数,无返回值
public static void testFunWithInt(int_int) {
    Log.e("Himi","静态函数示例1.有参数,无返回值;传入的参数int=" + _int);
}


运行截图:

 
示例代码段3:

Xcode 代码:

//静态函数示例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");
jint _int ;
if (!isHave) {
    CCLog("jni:此函数不存在");
}else{
    CCLog("jni:此函数存在");
    //调用此函数
    _int = minfo.env->CallStaticIntMethod(minfo.classID, minfo.methodID,823);
 
    //尝试jint是否能正常接收返回的int值
    JniMethodInfo minfo_ty;
    boolisHave = JniHelper::getStaticMethodInfo(minfo_ty, "com/ai/ommr/OhMonsterMR4Android","testFunWithInt", "(I)V");
     if(isHave) {
         minfo_ty.env->CallStaticVoidMethod(minfo_ty.classID, minfo_ty.methodID,_int);
     }
 
}
CCLog("jni-java函数执行完毕");
#endif


 

Android(Java) 代码:

 

// 静态函数示例3.有参数,有返回值
public static int testFunWithIntAndRtn(int_int) {
    Log.e("Himi","静态函数示例1.有参数,有返回值;传入的参数int=" + _int);
    return_int+1000;
}


运行截图:

 
示例代码段4:

Xcode 代码:

 

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    JniMethodInfo minfo;//定义Jni函数信息结构体
    //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
    boolisHave = JniHelper::getStaticMethodInfo(minfo,  "com/ai/ommr/OhMonsterMR4Android","testFunWithStringAndRtn","(I)Ljava/lang/String;");
    jobject jobj;
    if(!isHave) {
        CCLog("jni:此函数不存在");
    }else{
        CCLog("jni:此函数存在");
        //调用此函数
        jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID,823);
    }
    CCLog("jni-java函数执行完毕");
#endif


Android(Java) 代码:

 

// 静态函数示例4.有参数,有返回值(String类型)
public static String testFunWithStringAndRtn(int_int) {
    Log.e("Himi","静态函数示例4.有参数,有返回值(String类型);int=" + _int);
    return"yes,return 'String' is OK --by Himi";
}


运行截图:

示例代码段5:

Xcode 代码:

 

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    JniMethodInfo minfo;//定义Jni函数信息结构体
    //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
    boolisHave = JniHelper::getStaticMethodInfo(minfo,
                                                "com/ai/ommr/OhMonsterMR4Android", //类的路径
                                                "rtnActivity",  //方法名
                                                "()Ljava/lang/Object;");  //括号里的是参数,后面的是返回值。
    jobject jobj;
    if(isHave) {
       jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
    }
    CCLog("正确获取到 jobj");
 
    //
    isHave = JniHelper::getMethodInfo(minfo,
                                                 "com/ai/ommr/OhMonsterMR4Android", //类的路径
                                                 "nostaticFun",  //方法名
                                                 "()V");  //括号里的是参数,后面的是返回值。 
 
    if(isHave) {
         minfo.env->CallVoidMethod(jobj, minfo.methodID);
    }
     CCLog("jni-java函数执行完毕");
#endif


Java 代码:

 

//---- 函数示例之非静态函数调用
//(先获取个对象)
public static Activity actInstance;//定义单例
public static Object rtnActivity() {
    returnactInstance;
}
//使用此对象进行调用非静态函数
public void nostaticFun() {
    Log.e("Himi","no static Function is OK - By Himi");
}


运行截图:

 
cocos2dx 3.3工程,C++通过JNI与Java相互调用 最近游戏中要接入移动MM的SDK,研究了下c++与Java的相互调用,cocos2dx3.3的工程。新建一个工程,把class和proj.android覆盖可以导入eclipse下跑了。 立即下载

相关推荐

13个GNS3 3.0.5 appliances设备模板镜像合集:IOSv/L2,IOU L2/L3,以及IOS-XE

13个GNS3 appliances设备模板:IOSv/L2,IOU L2/L3,以及IOS-XE合集

haierccc的博客 1070

cocos2dx 调用java,cocos2dx中利用xcode 调用java中的函数

1.先把cocos2dx根目录中的/Users/zhaoshun/cocos2dx/cocos2d-2.0-x-2.0.4/cocos2dx/platform/android 目录拷贝到 xcode项目的工程根目录/libs/cocos2dx/platform 目录下2.在xcode工程中文件开头加入 预编译//使用预编译,对当前平台为Android时才会导入如下头文件#if (CC_TARGET...

weixin_35661054的博客 282

射频总集篇:(不断更新)

射频每一章涉及到的重点理论/设计方法 CHAPTER 1 传输线理论 输入阻抗Zin,负载阻抗ZL,驻波比ρ,反射系数 CHAPTER 2 波导 矩形波导,圆波导,同轴线 CHAPTER 3 微型带状传输线 微带线的参数设计,带状线的参数设计 CHAPTER 4 ...

jieyannn的博客 1919

cocos 调用java_cocos2dx 调用java层代码

1.导入头文件#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include #include "android/log.h"#include "platform/android/jni/JniHelper.h"#endif2.详尽代码JniMethodInfo minfo;//JniHelper/* 测试用方法 *//*bool isHave = J...

weixin_39766910的博客 301

C# + NAudio:构建支持实时音频处理的语音聊天应用(含回声消除)

本文介绍了如何利用C#和NAudio库开发实时语音聊天应用,重点实现回声消除功能。首先概述了NAudio库在音频处理中的作用,包括音频录制、播放和实时处理能力。然后详细讲解了构建基础语音聊天应用的过程,包括麦克风录制和扬声器播放的实现。接着深入探讨了回声消除的原理和实现方法,提出通过比较麦克风输入和扬声器输出的音频信号来消除回声,并给出了核心代码示例。最后,文章还讨论了性能优化方向,如多线程处理和网络传输扩展。该方案为开发高质量实时语音应用提供了实用参考。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1009

【问题解决】解决 Python `PermissionError` 权限不足:文件/进程/端口全场景修复

本文总结了Python程序中常见的权限问题及解决方案,包括文件、进程和端口权限错误。文件权限问题通常由文件占用、权限不足或路径错误引起;进程问题多因权限不足或系统限制;端口问题则与端口占用、防火墙或特权端口相关。解决方案提供了详细的代码实现:文件权限管理器类(FilePermissionManager)包含检查权限(check_permission)、修复权限(fix_permission)、安全写入(safe_write)和安全删除(safe_delete)等方法,通过异常处理和临时文件等技术确保操作安全

博客 357

cocos2dx java js_CocosCreator 中 JS 与 Java 互相调用方式和注意事项

JS 调用 Java 方法在 CocosCreator 下 JS 调用 Java/Objective-C 的格式都是:var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)JS 只能调用 Java 中的静态方法,需要传入类名、方法名、方法签名、方法参数,并且可以获得...

weixin_33393017的博客 632

芒果YOLO11改进172:ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea

ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea

包括YOLOv5、YOLOv7、YOLOv8等模型改进 1515

cocos2d-x调用java接口详解

cocos2d-x调用java接口 1. jni.h , F:\cocos2d-x-3.2\cocos\platform\android\jni\jni\JniHelper.h 2. 如果jni.h没有,去C:\Program Files\Java\jdk1.7.0_05\include\jni.h and C:\Program Files\Java\jdk1.7.0_05\include\win32\jni_md.h copy to VS setup path VC/include 3. 4.

翻肚鱼儿的博客 689

华为云物联网系统开发(纯云端)外包方案及项目需求说明书

提供一个详细的需求文档(SRS,Software Requirements Specification),用于指导完全零基础的非专业负责人外包兼职专业技术人员开发一款基于华为云物联网平台、Astro低代码平台和Astro Canvas大屏设计的物联网系统,纯软件实现并支持下载部署。文档涵盖详细的软硬件组成清单(聚焦软件和云服务)、技术文档要求等,确保非专业人员在移交后能够复用、扩展和操作该系统。本文档简洁、全面,适合非技术背景的管理者使用,并基于华为云生态的内部实施部署。

hy行者勇哥的博客 617

mojoPortal 路径穿越漏洞复现(CVE-2025-28367)(附脚本)

 在 mojoPortal CMS 版本 <=2.9.0.1 中发现了一个导致 ViewState 反序列化的目录遍历漏洞。通过利用此问题,未经身份验证的攻击者可以泄露 Web 根目录中的敏感文件,包括应用程序的文件。此配置文件包含用于验证和解密 ViewState 数据的文件。知道此密钥后,网络攻击者可以构建恶意 ViewState 有效负载,从而导致在底层服务器上执行远程代码。(CVE-2025-28367)

iSee857的博客 500

Cocos2d-x利用jni调用java层代码

jni的意思是java本地调用,通过jni可以实现java层代码和其他语言写得代码进行交互。在cocos2d-x中,如果想要在c++层调用java层的代码,就是通过jni技术。通过调用java层的代码,我们就可以在Android平台下实现一些引擎没有提供给我们的功能,或者做一些其他的功能。比如加个广告,加个分享,调用Android原生的对话框等等吧。Cocos2d-x比较人性化的是为我们封装了jn

Future Of Magic 9807

15、 深入理解Akka微服务:创建与管理体育博彩平台

本博文深入探讨了如何使用Akka微服务架构为体育博彩平台创建投影和管理事件数据,包括市场投影、投注投影以及数据库投影的实现。同时,介绍了通过gRPC提供HTTP端点以供外部系统访问的方法,并详细说明了在本地环境和Kubernetes中运行应用程序的步骤及配置建议。

weixin_35756624的博客 96

cocos java调用c_cocos2d-x 中java调用c/c++函数

cocos2d-x 中java调用c/c++函数这个是在JniHelper的基础上添加的,可以对比者看,java中的函数是backAction,主要调用的函数JNIEXPORT void JNICALL Java_org_cocos2dx_Game_JavaHelper_backAction(JNIEnv *env, jobject thiz, jstring key, jstring messa...

weixin_30305727的博客 201

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

cocos2d-x c 调用java_cocos2d-x中使用JNI的调用JAVA方法

用cocos2d-x发布Android项目时,都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface)。JNI是JAVA的一个通用接口,旨在本地化语言(如CC++)与JAVA语言进行交互,在交互过程成中,JAVA调用的是已编译好的本地化语言的二进制代码(如Windows下的dll,Linux下的so文件),所以在交叉编译时看到Eclipse的控...

weixin_35049095的博客 285

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

cocos2d-x 调用java_cocos2d-x中使用JNI的调用JAVA方法

用cocos2d-x公布Android项目时。都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface)。JNI是JAVA的一个通用接口。旨在本地化语言(如C\C++)与JAVA语言进行交互。在交互过程成中,JAVA调用的是已编译好的本地化语言的二进制代码(如Windows下的dll。Linux下的so文件)。所以在交叉编译时看到Eclipse的...

weixin_36341500的博客 373

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Cocos2d-x调用Java最终实例代码

HelloWorldScene.cpp #include "HelloWorldScene.h" #include "SimpleAudioEngine.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include #include "platform/android/jni/JniHelper.h" #include #endif

StupidCodeGenerator的专栏 6792

cocos2d-x 调用java_cocos2d-x中通过Jni实现Java与C++的互相调用

cocos2d-x中通过Jni实现Java与C++的互相调用。cocos2d-x用开发者提供了一个类JniHelper,提供了java与c++之间互调的jni解决方案。笔者所开发的“史上最坑爹的游戏”项目中使用到了JNI,为此专门定义了一个类JniUtil.头文件JniUtil.h中需要引入如下两个.h文件:#include#include"platform/android/jni/JniHe...

weixin_39785286的博客 174

cocos2d-x 调用java_Cocos2d-x 中C++调用java(jni)

.cpp//加载头文件#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include "../android/jni/JniHelper.h"#include #endif.cpp中调用java函数,"(I)Ljava/lang/String;" 要注意String后面的“;”号一定要加上//非静态函数示例#if (CC_TARGET_PLATFOR...

weixin_36486007的博客 258

cocos2d c 调用java,Cocos2D-X中在C++中调用JAVA的方法

Cocos2D-X中在C++中调用JAVA的方法------------------------------------------------------C++ 调用Java必须的有关键字 native。注释:1.Java_com_newtest2_jniHelper_SendInfo ”Java”开头 ”com_nretest2”为包名 ”jniHelper”为对应的java文件 ”SendI...

weixin_29587591的博客 227

cocos2d c 调用java_C/C++调用java,以及在cocos2d-x下的实现

c调用java走的也是jni,具体流程: 1、初始化jvm 2、加载你要调用的java类 3、获取类中的函数 4、调用函数 我们一步步来,首先编写一个java类(没有它什么都是扯淡~~),我写了一个最简单的 package com.cjni; public class CJniTest { publicCJniTest() { supe...

weixin_30774211的博客 214

C++ 调用 Java Cocos2d-x利用jni调用java层代码

JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)所以我们需要引用JNI头文件。(引入前做一下平台判断) #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include #include "platform/android/jni/JniHelper.h"

zhanghow的博客 603

Cocos2D-X中在C++中调用JAVA的方法

CPP文件中(以HelloWorld为例): 1、 首先导入h文件: #include "../platform/android/jni/JniHelper.h" 2、 在需要调用JAVA方法的地方,加入如下代码: #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 JniMethodInfo

u013321328的专栏 3327

cocos2d-x中使用JNI的调用JAVA方法

在发布Android项目时,都应该知道JAVA与C/C++进行交互时会涉及到

kingabcde的专栏 1267

cocos2d-x c 调用java_使用JNI使用Java来调用C的Android / Cocos2d-x不满意链接错误

编辑:我已经解决了这个问题(并通过更改以下内容找到了JNI苦难中的下一个问题!)在Java和C中删除本机方法的“静态”声明,添加Java方法以获取我的SimpleGame类的实例,并调用public static void callCppApiResponse (String result, String token, long context) {**getInstance()**.cppAnd...

weixin_35764532的博客 116
上一篇: 搭建MideiaWiki记录
下一篇: 开始编写Cocosd-x对Java进行调用的测试代码
垃圾桶
博客等级 码龄15年 20粉丝 18原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值