zoukankan      html  css  js  c++  java
  • cocos2dx-JniHelper 使用

    1.操作的游戏工程和cocos2d_x游戏引擎是一个目录的

    2.跟jni相关的C++代码文件放在proj.androidjnihellocpp目录下,每加一个cpp文件,都需在proj.androidjni的Andriod.mk文件中添加:

    LOCAL_SRC_FILES := hellocpp/main.cpp 
                 hellocpp/test.cpp     <--为新添加的
    
               ...

    3.跟jni相关的java代码文件放在proj.androidsrcjtSwordsMen目录下

    一、C++调用Andriod接口

    1.定义一个.h文件“test.h”,内容:

    extern "C"  //因为jni将java代码转过来是c的,所以C++引用得加上
    {
        void showExitPt(const char *title, const char *msg); //showExitPt将调用Andriod工程中实现的方法
    }

    2.定义一个.cpp文件“test.cpp”,内容:

    复制代码
    #include <jni.h>
    #include "platform/android/jni/JniHelper.h"
    
    ...
    
    //表示proj.androidsrcjtSwordsMenJniTestHelper.java的,在该文件里有showTipDialog的实现
    #define CLASS_NAME "jt/SwordsMen/JniTestHelper"
    //事实上,showExitPt一般都是跟showTipDialog同名的,这里为了区分,写成不一样 void showExitPt(const char *title, const char *msg) {   
      JniMethodInfo t;   
      //getStaticMethodInfo判断是否在java中实现了名字showTipDialog的方法   
      //"(Ljava/lang/String;Ljava/lang/String;)V" 对该方法的一个描述,详见说明   
      if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "showTipDialog", "(Ljava/lang/String;Ljava/lang/String;)V"))   {     
        jstring jTitle = t.env->NewStringUTF(title);     
        jstring jMsg = t.env->NewStringUTF(msg);     //根据该方法的返回值调用对应的CallStaticxxxMethod方法,如CallStaticIntMethod     
        t.env->CallStaticVoidMethod(t.classID, t.methodID, jTitle, jMsg);     
        t.env->DeleteLocalRef(jTitle);     
        t.env->DeleteLocalRef(jMsg);   
      }
    }
    复制代码

    3.java实现,代码如下,具体代码最后一定提供

    定义一个JniTestHelper.java文件,内容:

    复制代码
    private static void showTipDialog(final String title, final String text)
        {
            Message msg = mHandler.obtainMessage();
            msg.what = SwordsMen.SHOW_DIALOG;
            DialogMessage dm = new DialogMessage();
            dm.title = title;
            dm.msg = text;
            msg.obj = dm;
            msg.sendToTarget();
        }
    复制代码

    4.程序使用

    复制代码
    //需要宏处理,否则so文件生成会有问题
    #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    #include "../proj.android/jni/hellocpp/test.h"
    #endif
    
    void CMainScene::exitGame()
    {
    #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
        showExitPt("Prompt", "if Exit Game ?");
    #endif
    #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
        ExitDlg *pDlg = ExitDlg::create();
        addChild(pDlg, 2);
    #endif
    }
    复制代码

    二、Andriod调用C++接口

    1.在test.cpp中加入实现内容:

    复制代码
    #include "cocos2d.h"
    void setPackageName(const char *packageName)
    {
        CCLog("packageName: %s", packageName);  
    }
    
    void exitApp()
    {
        CCDirector::sharedDirector()->end();
    }
    复制代码

    2.Andriod工程中的声明(JniTestHelper.java):

    public static native void setPackageName(String packageName);
    public static native void exitApp();

    3.将C++实现与Andriod工程中的声明关联(test.cpp)

    复制代码
    //1.Java_:是格式,必须加的 
    //2.jt_SwordsMen_JniTestHelper:是路径proj.androidsrcjtSwordsMenJniTestHelper.java去掉proj.andriodsrc的部分
    //3.setPackageName:是Andriod工程中声明的名字
    //4.中间需要_分开 void Java_jt_SwordsMen_JniTestHelper_setPackageName(JNIEnv *env, jobject thiz, jstring packageName)
    {
        const char *pkgName = env->GetStringUTFChars(packageName, NULL);
        setPackageName(pkgName);
        env->ReleaseStringUTFChars(packageName, pkgName);
    }
    
    void Java_jt_SwordsMen_JniTestHelper_exitApp(JNIEnv *env, jobject thiz)
    {
        exitApp();
    }
    复制代码

    4.程序调用:

    JniTestHelper.exitApp();
    JniTestHelper.setPackageName(this.getPackageName());
  • 相关阅读:
    汇编学习笔记(25)
    在QT C++中调用 Python并将软件打包发布(裸机可运行)
    集合类
    解决python matplotlib 中文字体的显示乱码-Windows系统;RuntimeWarning: Glyph
    元数据库设计
    解决方案sln工程csproj
    托管代码和非托管代码的区别
    IIS安装和使用URL重写工具-URL Rewrite
    SSL证书及使用
    rpc和rpcwithcert两个虚拟目录
  • 原文地址:https://www.cnblogs.com/liugangBlog/p/6434542.html
Copyright © 2011-2022 走看看