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() {             super();       }       publicstatic int add(int a, int b) {             returna+b;       }       publicboolean ju(boolean b) {             return!b;       } } 放到com/cjni文件夹下,编译后得到class文件。OK,java类解决了。 接下来就是C代码了: #include "stdafx.h" #include "jni.h" #include "jni_md.h" #include using namespace std; #pragma comment(lib, "jvm.lib") void callFunction(JNIEnv* env) {       jclasscls;       jmethodIDmid;       jbooleanb;       jobjectjobj;       jintsquare;       //加载类       cls =env->FindClass("com/cjni/CJniTest");       if(cls != 0){             //获取静态方法add,第三个参数为sig             mid =env->GetStaticMethodID(cls, "add", "(II)I");             if(mid != 0){                   //调用方法                   square =env->CallStaticIntMethod(cls, mid, 10, 20);                   cout<GetMethodID(cls,"", "()V");             if(mid != 0){                   //创建对象                   jobj =env->NewObject(cls, mid);                   cout<GetMethodID(cls, "ju", "(Z)Z");             if(mid != 0){                   //调用方法                   b =env->CallBooleanMethod(jobj, mid, 1);                   if(!b)                         cout<DestroyJavaVM();       }       else {             cout<DestroyJavaVM();       }       else {             cout<GetStaticMethodID或env->GetMethodID的第三个参数为sig,这个值可以通过如下命令查看: F:\source\vc\CCallJava\com\cjni>javap -p -sCJniTest Warning: Binary file CJniTest contains com.cjni.CJniTest Compiled from "CJniTest.java" public class com.cjni.CJniTest {   public com.cjni.CJniTest();       Signature:()V   public static int add(int, int);       Signature:(II)I   public boolean ju(boolean);       Signature:(Z)Z } 上面的Signature就是sig值,至于为什么会需要这个参数,原因是java支持函数重载,所以只是用函数名是无法定位一个函数的,sig的功能就是协助定位一个函数,其命名规则是根据函数参数与返回值构造一个字符串,将其与函数名共同标示一个函数,括号里面的参数类型,括号外的是返回值类型。(话说C++中对于重载函数也是需要处理的,编译后生成的乱七八糟的函数名,调试的时候哦很无语) 以上是jni的基本用法,详细的还有很多,有了这些知识,足够我们在cocos2d-x中调用java了。 创建一个android平台的cocos2d-x项目,我创建了一个例子项目叫cardmap,那么在项目中的cardmap\proj.android\src\org\cocos2dx\cardmap目录是存放java文件的地方,手工写个java类, package org.cocos2dx.cardmap; public class CardMapJni {       publicCardMapJni() {             super();       }       publicstatic int add(int a, int b) {             returna+b;       }       publicboolean ju(boolean b) {             return!b;       } } 和上面的很像?只是package和类名不同,嘿嘿 然后打开大名鼎鼎的HelloWorldScene.cpp, 在最上面加入如下代码: #include "platform/android/jni/JniHelper.h" #include #include 主要是将jni相关头文件包含进来。 然后随便写个函数: int testJNI() {       JniMethodInfo method;       bool b =JniHelper::getStaticMethodInfo(method,"org.cocos2dx.cardmap.CardMapJni", "add", "(II)I");       if(b){             jint square= method.env->CallStaticIntMethod(method.classID,method.methodID, 50, 60);             returnsquare;       }       return0; } 代码很简单,调用add方法并返回结果。 对代码做一下简要分析: JniMethodInfo 是在JniHelper.h中声明的,如下: typedef struct JniMethodInfo_ {       JNIEnv*      env;       jclass          classID;       jmethodID    methodID; } JniMethodInfo; 其包装了env,class与method。 从类中获取一个方法使用JniHelper::getStaticMethodInfo或JniHelper::getMethodInfo,函数会将调用函数所需的信息放入第一个参数中,这样就可以通过JniMethodInfo调用对应的函数了。 实际开发中,可以针对每个需要调用的java类,封装与其对应的c++类,在初始化时将JniMethodInfo封装好,在需要的时候直接调用就行了~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值