作者:何卫

转载请注明,原文链接:http://www.cnblogs.com/hewei2012/p/3376616.html

前提条件:

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

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

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

           ...

3.跟jni相关的java代码文件放在proj.android\src\jt\SwordsMen目录下

一、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.android\src\jt\SwordsMen\JniTestHelper.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, );
#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.android\src\jt\SwordsMen\JniTestHelper.java去掉proj.andriod\src的部分//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());

相关代码下载

cocos2d-x中的Jni使用(C++与Andriod方法互调)的更多相关文章

  1. cocos2d 中使用jni C++ 调用 Java 方法

    1.简单数据类型样例 如果我们Java中有这么一个open的静态方法,它没有參数,有一个int的返回值.怎么在C++中调用它呢? package cb.CbCCBLE; public class Cb ...

  2. cocos2d 中使用jni Java 调用 C++ 方法

    1.首先是LoadLibrary cocos2d中的C++代码会编译成一个.so文件.放在安卓文件夹下的libs/armeabi 下,然后java会load进来,这步我们不用做了,由于cocos2d已 ...

  3. android中使用jni对字符串加解密实现分析

    android中使用jni对字符串加解密实现分析 近期项目有个需求.就是要对用户的敏感信息进行加密处理,比方用户的账户password,手机号等私密信息.在java中,就对字符串的加解密我们能够使用A ...

  4. cocos2d-x中使用JNI的调用JAVA方法

    用cocos2d-x公布Android项目时.都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface).JNI是JAVA的一个通用接口.旨在本地化 ...

  5. 如何在cocos2d项目中enable ARC

    如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...

  6. 如何在Cocos2D游戏中实现A*寻路算法(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  7. 如何在Cocos2D游戏中实现A*寻路算法(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  8. Android中关于JNI 的学习(一)对于JNIEnv的一些认识

    一个简单的样例让我们初步地了解JNI的作用.可是关于JNI中的一些概念还是需要了解清楚,才干够更好的去利用它来实现我们想要做的事情. 那么C++和Java之间的是怎样通过JNI来进行互相调用的呢? 我 ...

  9. Android中关于JNI 的学习(四)简单的样例,温故而知新

    在第零篇文章简单地介绍了JNI编程的模式之后.后面两三篇文章,我们又针对JNI中的一些概念做了一些简单的介绍,也不知道我究竟说的清楚没有.但相信非常多童鞋跟我一样.在刚開始学习一个东西的时候,入门最好 ...

随机推荐

  1. Extjs关于FormPanel布局

    Extjs关于FormPanel布局 FormPanel有两种布局:form和column,form是纵向布局,column为横向布局.默认为后者.使用layout属性定义布局类型.对于一个复杂的布局 ...

  2. PHP对XML文件操作类讲解

    <?phpclass XML{    private $dom;        function __construct ()    {        $this->dom = new D ...

  3. Java Servlet Filter(转)

    做web开发的人对于Filter应该不会陌生,一直在很简单的使用,但是一直没有系统的总结一下,随着年纪的慢慢长大,喜欢总结一些事情,下面说说我对Filter的理解,官方给出的Filter的定义是在请求 ...

  4. hdu 3790 最短路径问题(最短路,Dijsktra)

    题目 Dijsktra基础题,只是多了一个花费,稍稍变动处理就好 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include&l ...

  5. HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)

    想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权.但是怎么枚举这m个点,实在不会.网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用. 参考链接:http:/ ...

  6. **【ci框架】PHP的CI框架集成Smarty的最佳方式

    因为CI自带的模板功能不是很方便,所以大家普遍采用集成Smarty的方式来弥补CI这方面的不足. 本人在网上看了不少CI集成Smarty的教程,包括咱们CI论坛里面的一个精华帖子 http://cod ...

  7. HttpWebRequest和HttpWebResponse

    原文:http://blog.csdn.net/haitaofeiyang/article/details/18362225 申公前几日和一个客户做系统对接,以前和客户对接一般采用webservice ...

  8. Happy Number

    https://leetcode.com/problems/happy-number/ Write an algorithm to determine if a number is "hap ...

  9. Ubuntu 取消sudo密码

    需求:在Ubuntu下装了FQ代理goagent之后,为了goagent能够开机启动.因为goagent需要sudo权限,所以要去掉sudo密码. 要修改的文件位于/etc/sudoers,先备份: ...

  10. 区间dp笔记√

    区间DP是一类在区间上进行dp的最优问题,一般是根据问题设出一个表示状态的dp,可以是二维的也可以是三维的,一般情况下为二维. 然后将问题划分成两个子问题,也就是一段区间分成左右两个区间,然后将左右两 ...