作者:何卫

转载请注明,原文链接: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. java接口的方法默认都是public abstract类型

    java接口的方法默认都是public abstract类型, 因此我们在编写接口的实现类的时候,方法的实现前面要显式的加上public访问控制符

  2. InterlliJ调试:Method breakpoints may dramatically slow down debugging

    问题:Method breakpoints may dramatically slow down debugging 因为此问题久久不能调试.问题发现后原来如此... 原因:设置了方法断点!--什么是 ...

  3. CSS基础知识学习笔记

    1.css基本样式讲解 1.1 css背景background-attachment:背景图像是否固定或者随着页面的其余部分滚动background-color:设置元素的背景颜色background ...

  4. hdu 1056

    水题 ~~  按题目要求直接判断~. /************************************************************************* > A ...

  5. JS常见排序算法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 【c++基础】const、const指针、const引用

    一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) ; co ...

  7. 深入理解Tornado——一个异步web服务器

    本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...

  8. hdu 1596 find the safest road(最短路,模版题)

    题目 这是用Dijsktra做的,稍加改动就好,1000ms..好水.. #define _CRT_SECURE_NO_WARNINGS #include<string.h> #inclu ...

  9. java基础知识回顾之javaIO类---FileWriter和FileReader

    FileWriter类的构造方法定义如下: 1.public FileWriter(File file)throws IOException 字符流的操作比字节流操作好在一点,就是可以直接输出字符串了 ...

  10. SQO2008配置管理工具服务显示远程过程调用失败

    前两天,装了VS2012后,打开SQL2008配置管理工具,发现SQL服务名称里什么也没有,只有一个提示:(如图) 卸载了一个叫"Microsoft SQL Server 2012Local ...