• 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());
  • 相关阅读:
    torch.Tensor.view (Python method, in torch.Tensor)
    python子类调用父类的方法
    读sru代码
    Python标准库内置函数complex介绍
    numpy之ones,array,asarray
    failed: Name or service not known. wget: unable to resolve host address Ubuntu报错解决
    C++部分基础知识笔记
    《机器学习》西瓜书第十三章半监督学习
    python小笔记
    解决python中调用 imread 报错:ImportError: cannot import name imread
  • 原文地址:https://www.cnblogs.com/liugangBlog/p/6434542.html
Copyright © 2020-2023  润新知