Cocos2d-x3.1通过JniHelper调用Java类中静态函数




1、创建Cocos2d-x工程

(1)cd /Users/自己用户名/Desktop/cocos2d-x-3.1/tools/cocos2d-console/bin (2)cocos new JniDemo -p com.pactera.jni -l cpp -d 自己的工程路径

2、将新建工程的proj.android导入ADT

(1)FILE->Import->Android->Existing Android Code Into Workspace (2)next->Browse,找到刚才创建工程目录中的proj.android,Finish即导入完成

3、将新建工程导入XCode

(1)点击proj.ios_mac中的XXXX.xcodeproj即完成导入。 (2)在HelloWorld.cpp头文件下添加如下代码:




#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#include <jni.h>

#include "../../cocos2d/cocos/platform/android/jni/JniHelper.h"//这里的路径要根据你工程的实际情况进行更改

#include 

 

#if1

#define  LOG_TAG   "JniHelper"

#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)

#else

#define  LOGD(...)

#endif

 

#endif</android></jni.h>


(3)在下面函数中添加如下代码:



void HelloWorld::menuCloseCallback(Ref* pSender)

{

#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);

    }

     

    ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func2","()I");

    if(ret)

    {

        log("call int func2() succeed");

        jint iret = info.env->CallStaticIntMethod(info.classID,info.methodID);

        log("func2 return = %d",iret);

    }

     

    ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func3","(I)Ljava/lang/String;");

    if(ret)

    {

        log("Call int func3(int) succeed");

        jobject jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID,1438);

    }

     

    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);

        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

}

这样点击HelloWorld中的关闭按钮,即可在控制台打印出上面的信息。 注意getStaticMethodInfo中的四个参数,第一个不用说,基本用法,第二个是第三个函数的路径,具体位置为proj.android/src目录下得路径,Cocos2d-x3.1的路径值为:org/cocos2dx/cpp。记住这一步,一会儿还用得到。

4、ADT中创建java新类

(1)单击ADT中工程名称,展开工程目录,找到src,单击展开src目录,看到该目录下有一个AppActivity.java的类,为了演示我们的功能,右击New->Class,填入类名,如:TestJni,此时在src目录中增加了一个TestJni.java的类。注意此时应该会报错。看下一步。 (2)第(1)步中出现的错误一般是因为没有导入引擎下的src。具体操作是:右击工程名->Properties-> Java Build Path->Source->Link Source->Browse。此时导入引擎目录下如:cocos2d-x-3.1/cocos/platform/android/java/src,然后在Folder name中随便写一个名字即可。点击Finish,OK。此时会在工程目录中添加刚才导入目录的引用。第(1)步的错误也就消失了。 (3)在(1)步创建的类中添加如下代码:




package org.cocos2dx.cpp;

 

import android.R.integer;

import android.util.Log;

 

public class TestJni {

    publicstaticvoid func1()

    {

        Log.e("hello","world");

    }

     

    publicstaticint func2()

    {

        return12345;

    }

     

    publicstaticString func3(inti)

    {

        String str ="get int value:"+ i;

        Log.e("yu", str);

        returnstr;

    }

     

    publicstaticString func4(String str)

    {

        Log.e("func4","str");

        returnstr;

    }

     

    publicstaticint func5(inta,intb)

    {

        intc = a + b;

        Log.e("func5","a+b");

        returnc;

    }      

}

(4)至此,我们即可进行编译了,对了,在Xcode工程中,HelloWorld.cpp文件中getStaticMethodInfo中第2个参数的路径是怎么回事儿呢。如果一直跟着我的做,此时该路径为org/cocos2dx/cpp/TestJni。第三个参数为TextJni.java中的静态函数。其他参数的具体含义自行百度。这里主要讲路径是怎么回事。

5、编译吧

是不是又出现问题了,如果是第一次编译,可能是没有配置NDK_ROOT环境,解决办法见博客 http://blog.csdn.net/yuxikuo_1/article/details/39536287 简单的说就是,使ADT处于屏幕最前端,单击左上角的ADT->Preferences->C/C++->Build->Environment,依次敲上你NDK的位置和NDK_ROOT即可。

6、至此,在Cocos2d-x工程中通过Jni调用java中的静态函数应该没问题了。下面是程序的截图。

转自:http://www.2cto.com/kf/201409/338207.html




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值