作者:何卫

转载请注明,原文链接: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. Windows Server 2008下共享资源访问走捷径 (不用用户名 和 密码 访问共享)

    1. 启用来宾帐号2. 共享目录添加“Guest”帐号3. “gpedit.msc”,打开对应系统的组策略编辑窗口;在该编辑窗口的左侧显示区域,依次展开“本地计算机策略”/“计算机配置”/“Windo ...

  2. 解决asp.net mvc中*.resx资源文件访问报错

    个人笔记 问题重现 在asp.net mvc中,使用资源文件会出现一个问题,例如: 紧接着我进入视图界面,输入下面代码: <a href="javascript:void(0);&qu ...

  3. android2.3 -添加自定义按键:作唤醒功能 .

    最近需要做个唤醒功能,当按键的时候android系统唤醒并点亮屏,在长按键中,系统不能在进入睡眠. 驱动方面: 1:在平台设备文件中添加 一个按键,定义为唤醒源! \arch\arm\mach-s5p ...

  4. Interface Comparator

    int compare(T o1, T o2) Compares its two arguments for order. Returns a negative integer, zero, or a ...

  5. hdu 1253 胜利大逃亡(广搜,队列,三维,简单)

    题目 原来光搜是用队列的,深搜才用栈,我好白痴啊,居然搞错了 三维的基础的广搜题 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #in ...

  6. java基础知识回顾之java Socket学习(一)--UDP协议编程

    UDP传输:面向无连接的协议,不可靠,只是把应用程序传给IP层的数据报包发送出去,不保证发送出去的数据报包能到达目的地.不用再客户端和服务器端建立连接,没有超时重发等机制,传输速度快是它的优点.就像寄 ...

  7. IOS:利用dispatch_once创建单例

    在之前有一篇学习笔记中,记载了一篇如何在OC中实现单例的文章:<IOS学习笔记4—Objective C—创建单例>自苹果引入了Grand Central Dispatch (GCD)(M ...

  8. POJ1276Cash Machine

    http://poj.org/problem?id=1276 题意 : 给你一个目标钱数,再给你钱币的种数和钱币的面值,让你用这些钱凑出不大于目标钱数的钱然后输出这个最接近且不大于目标钱数的钱. 思路 ...

  9. python—命名规范(转)

    文件名全小写,可使用下划线 包应该是简短的.小写的名字.如果下划线可以改善可读性可以加入.如mypackage. 模块与包的规范同.如mymodule. 类总是使用首字母大写单词串.如MyClass. ...

  10. [hackerrank]Manasa and Stones

    https://www.hackerrank.com/contests/w2/challenges/manasa-and-stones 简单题. #include<iostream> us ...