位置: 编程技术 - 正文

Cocos2d-x c++和java相互调用

编辑:rootadmin

推荐整理分享Cocos2d-x c++和java相互调用,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

一:JAVA调用C&#;&#;:参考: void JNICALL Java_org_cocos2dx_cpp_AppActivity_setNetworkState(JNIEnv * env, jobject thiz, jint state){log("=========Java_org_cocos2dx_cpp_AppActivity_setNetworkState============> state = %d", state);g_networkstate = state;}#ifdef __cplusplus}#endif

Java的写法:

二:Java调用C&#;&#;

转自: 如果导入 "Jni.h"报错,

把 C:Program FilesJavajdk1.8.0_includejni.h和 C:Program FilesJavajdk1.8.0_includewinjni_md.h拷贝到C:Program Files (x)Microsoft Visual Studio .0VCinclude下

我的路径是上面这个, 使用vs。你的路径按你自己实际情况来操作。

jni的意思是java本地调用,通过jni可以实现java层代码和其他语言写得代码进行交互。在cocos2d-x中,如果想要在c&#;&#;层调用java层的代码,就是通过jni技术。通过调用java层的代码,我们就可以在Android平台下实现一些引擎没有提供给我们的功能,或者做一些其他的功能。比如加个广告,加个分享,调用Android原生的对话框等等吧。Cocos2d-x比较人性化的是为我们封装了jni调用的一些接口,这个类就是JniHelper,我们只需要使用这个类提供给我们的接口就可以完成调用java层代码的功能。先说一下这个类的位置,因为自己在找的时候有点犯二,所以特意说明一下。在3.0和3.1以上的引擎版本中,这个类的位置分别如下。

3.1以后引擎把原来cocos目录下的包含各个功能的文件夹都放到了cocos目录下,我个人认为这样的放法还是比较好的。就是引擎老改目录,希望以后不要放来放去了。最主要的当然是看看怎么使用JniHelper这个类了。

首先使用之前要包含头文件,写法如下,记住要加上条件编译,这个东西是Android平台下才用到。

1#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)2 3#include "platform/android/jni/JniHelper.h"4#include <jni.h>5 6#endifCocos2d-x c++和java相互调用

接着通过一小段代码来说明一下这个类的用法。

1#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)2// typedef struct JniMethodInfo_3// {4// JNIEnv * env;5// jclass classID;6// jmethodID methodID;7// } JniMethodInfo;8 9 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

大家书写代码的时候同样需要将代码使用条件编译写到里面,JniMethodInfo是一个结构体,这个结构体的定义就是代码中注释掉的地方,然后使用JniHelper调用了静态函数getStaticMethodInfo,从它的名字就知道这个函数的作用了,就是获得java层中静态函数的信息,这个信息保存在什么地方呢,当然是JniMethodInfo中了,我们要获取哪个类的哪个函数呢,第二个参数和第三个参数就是告诉JniHelper我们要获取的是哪个函数的信息了,第二个参数是类文件的包名路径,我在org/cocos2dx/cpp这个路径下新建了一个类,叫做TestJni。其实前面的路径就是一个包名,这里使用的时候用/代替.。org的路径当然就是我新建的这个工程的Android平台目录了。一会我要将这个项目打包然后测试一下,在eclipse下看看输出。第三个参数当然就是方法名字了,第四个参数是需要注意的一个,有人把它叫做签名,其实就是你要调用的java层函数的返回&#;和参数的类型说明。它把调用函数的参数写到前面的括号中,返回&#;跟在括号的后边,和我们平时书写函数的时候正好相反了。那那个V是什么东西呢,这个大写字母就是对应的一个类型,如果是void类型,那么就用一个V来代替,如果是一个int类型,那么就用一个I代替,是不是很简单,那其他的类型呢,如图所示。

放了俩张表,用得时候查就好了,关于这个参数其他的细节问题待会讨论。整个函数的返回&#;是一个bool类型,什么意思不用说了吧。当这个函数的信息存在的时候我们就进入到了if中了,然后我使用了info结构体的第一个变量来调用了函数CallStaticVoidMethod,这个函数可真是需要说一说。首先它的调用者就是保存函数信息的结构体JniMethodInfo的第一个成员变量env,这货是什么东西不用管,用就好了。然后这个函数的第一个字母是大写,这一点要小心,Call后边如果跟Static代表的就是我要调用的是一个静态的函数,如果没有那就不是静态的,不是静态的函数,我们使用JniHelper获取信息的时候用得就是getMethodInfo这个函数。然后Void代表的是函数的返回&#;,来看我们的例子,我调用的函数func1是一个无参无返回&#;的函数,这个看什么地方,当然java代码我接着会向你展示,但是你可以直接看getStaticMethodInfo这个函数的第四个参数啊。这里的这个void代表的是函数的返回&#;类型,所以如果调用的是返回&#;为int的java函数,那就是CallStaticIntMethod了。里边的参数就是结构体info的第二个和第三个成员变量了,代表的是类ID和函数ID。这样的话基本的用法就说清楚了,接着就是TestJni中得代码了,我把要调用到得函数都写了出来。

1package org.cocos2dx.cpp;2 3import android.util.Log;4 5public class TestJni6{7 public static void func1()8 {9 Log.e("xiaota","java:func1,called succeed!"); } public static int func2() { return ; } public static String func3(int i) { String str = "get int value:"&#;i; Log.e("xiaota",str); return str; } public static String func4(String str) { Log.e("xiaota",str); return str; } public static int func5(int a,int b) { int c = a&#;b; Log.e("xiaota","func5"); return c; }}

然后打包到Android平台,我们使用USB连接上电脑,打开eclipse,进行调试,看看信息输出了没有。

好了,这样的话就把这个流程都说明白了,下面我们看一些细节的地方。

1#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)2 3 log("android platform!");4// typedef struct JniMethodInfo_5// {6// JNIEnv * env;7// jclass classID;8// jmethodID methodID;9// } JniMethodInfo; 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); } //调用的函数有返回&#; ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func2","()I"); if(ret) { log("call int func2() succeed"); //返回的int&#;,用jint类型来接收 jint iret = info.env->CallStaticIntMethod(info.classID,info.methodID); log("func2的返回&#;是%d",iret); } //调用的函数有参数有返回&#;,这里有坑,注意Ljava/lang/String;后边的; ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func3","(I)Ljava/lang/String;"); if(ret) { log("call int func3(int) succeed"); //java层的类类型对应的是jobject,把需要传递的参数写到调用函数的后边 jobject jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID,); } //参数和返回&#;都是类类型 ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func4","(Ljava/lang/String;)Ljava/lang/String;"); if(ret) { log("call string func4(string) succeed"); jobject para = info.env->NewStringUTF("haha"); jstring jstr = (jstring)info.env->CallStaticObjectMethod(info.classID,info.methodID,para); //使用jstring2string函数将返回的jstring类型的&#;转化为c&#;&#;中的string类型 std::string text = JniHelper::jstring2string(jstr); log("%s",text.c_str()); } //如果函数需要的参数是俩个或者是多个,可以采用如下的写法 ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func5","(II)I"); if(ret) { log("call int func5(int a,int b) succeed"); jint iret = info.env->CallStaticIntMethod(info.classID,info.methodID,1,2); log("return value is %d",iret); }#endif

上边的代码主要还是那俩个函数调用的说明,getStaticMethodInfo的第四个参数如果是类类型,注意要使用的签名,后边的分号也要加,如果参数有多个,直接连起来书写就可以了。使用CallStaticMethod调用的时候注意一下参数和返回&#;的类型,传递参数的时候直接写到函数的后边,但是参数类型要正确,返回&#;使用对应的类型来接受,这个类型就是前面加一个j,比如java层返回的类型是int,那接受的类型就是jint,java层返回object,接受类型就是jobject。

以上是调用java的静态函数,接下来是非静态函数的调用。我将c&#;&#;的代码和java的代码都贴出来。

1JniMethodInfo info;2 bool ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJniHelper","getObj","()Ljava/lang/Object;");3 //先获得类的对象,然后用这个对象去调用它的非静态函数4 jobject jobj;5 if(ret)6 {7 log("call static method");8 jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID);9 } //getMethodInfo判断java定义的类非静态函数是否存在,返回bool bool re = JniHelper::getMethodInfo(info,"org/cocos2dx/cpp/TestJniHelper","func","()V"); if(re) { log("call no-static method"); //非静态函数调用的时候,需要的是对象,所以与静态函数调用的第一个参数不同 info.env->CallVoidMethod(jobj,info.methodID); }1package org.cocos2dx.cpp;2 3import android.util.Log;4 5public class TestJniHelper6{7 private static TestJniHelper instance = new TestJniHelper();8 public static Object getObj()9 { return instance; } public void func() { Log.e("xiaota","func is called"); }}

因为调用的是非静态的函数,所以我们使用CallVoidMethod的时候就不能传入类ID了,要传入一个对象,告诉它调用的是哪个对象的方法,所以为了有这么一个对象,我们就得先调用一个静态的方法来返回这个对象,然后用这个对象作为参数调用非静态函数。好了,关于Jni的基本用法就是这样了,只是本人的一点拙见,没有了解过的可以看看,如果是大神就绕路吧。

cocos2dx CardinalSpline和CatmullRom算法 想想那些鱼儿游动的漂亮曲线,还记得水果忍者的手指划过那一道道划痕吗,众所周知这一切都是很多个点组成的线段,这些都离不开样条插算法。特

Cocos2d-x的学习之旅(二)HelloWorld 声明本教程仅用于初学cocos2dx同学使用,内容由本人(Code-Man)编写,此教程使用cocos2dx版本为3.4。本教程内容可以自由转载,但必须同时附带本声明,或

屏蔽多点触摸 环境cocos2d-x-3.1.1ios版本找到AppController.mm修改方法-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions中[eaglViewsetMultipleTouchEnab

标签: Cocos2d-x c++和java相互调用

本文链接地址:https://www.jiuchutong.com/biancheng/368802.html 转载请保留说明!

上一篇:塔防游戏(二) 埋雷(防止游戏数据被更改)(塔防游戏二战)

下一篇:cocos2dx CardinalSpline和CatmullRom算法

  • 企业所得税的纳税人有哪些简答题
  • 小规模免缴增值税吗
  • 定期定额个体工商户怎么报税
  • 过桥费是多少
  • 报销单用法
  • 分公司企业所得税分配比例
  • 购销合同赔偿比例一般多少
  • 赠送客户的商品怎么入账
  • 个人所得税交税怎么交的
  • 二手车交易怎么办理过户手续
  • 账目不清什么意思
  • 公司租用房产税如何征收
  • 营改增后工业企业税率是多少?
  • 水利建设专项收入计入什么科目
  • 食堂购买的固定资产可以一次性加计扣除吗
  • 什么时候计提减值
  • 会员卡充值赠送金额怎么做账
  • mac 装 windows
  • 苹果六微信
  • autorun.exe无法运行
  • win11中文安装包
  • linux 命令行
  • 数据持久化操作
  • 前端男神尤雨溪传奇
  • 贷款减值准备什么科目
  • 企业雇佣临时工个税
  • 库存商品出库怎么计算
  • php xml
  • 应税行为包括销售货物吗
  • 民非企业保险支出包括
  • 土地使用税计入管理费用还是税金及附加
  • php 抓取别的网站的内容
  • 公司日常流水账
  • 微信小程序完整授权
  • vue+echarts
  • 深度卷积神经网络基本结构
  • uniapp前端 django后端
  • php如何自学
  • 投资者投入固定资产的成本,应当按照投资合同
  • 权益后利润是净利润么
  • 办理银行承兑汇票保证金比例
  • 织梦使用手册
  • 土地评估增值计入什么科目
  • 二手房过户需要户口本吗
  • 出租人在融资租赁中需要处理的会计问题
  • 政府补助免征企业所得税条件会计分录
  • 税款所属期止是怎么写
  • 外购存货的账务处理
  • 即征即退收入不能税前扣除
  • 个人社保信息变更流程
  • 企业所得税营业外收入
  • 红冲更正的正确分录
  • 异地预缴的企业所得税
  • 电子承兑汇票到期怎么兑现
  • 异价调拨什么意思
  • 融资租赁租金利息怎么算
  • 抵账房买卖流程
  • 退货开负数发票的情况该如何做会计处理?
  • 购买扶贫产品属于什么费用
  • 其他债权投资发生减值会影响所有者权益总额吗
  • 内部无形资产交什么税
  • mysql存emoji表情
  • Windows10安装包下载
  • 64位Vista、Windows7系统IIS连接数据库故障完美解决
  • win7系统出现蓝屏怎么进去桌面
  • 刻录ghost安装光盘
  • WIN10系统摄像头在哪打开
  • windows10使用ie浏览器
  • python中字符
  • linux shell脚本实例
  • Python工程师面试题 与Python基础语法相关
  • js模拟实现new
  • ubuntu各种方法卸载软件
  • 上海电子税务局怎么添加办税员
  • 黑龙江国税局官网
  • 深圳地税电子税务局
  • 上海个人到税务局怎么开票
  • 我国烟草税的税点是多少
  • 海口税务服务大厅
  • 税务行业微信缴税项目是什么消费
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设