cocos2d-x中的Jni使用(C++与Andriod方法互调)
作者:何卫
转载请注明,原文链接: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方法互调)的更多相关文章
- cocos2d 中使用jni C++ 调用 Java 方法
1.简单数据类型样例 如果我们Java中有这么一个open的静态方法,它没有參数,有一个int的返回值.怎么在C++中调用它呢? package cb.CbCCBLE; public class Cb ...
- cocos2d 中使用jni Java 调用 C++ 方法
1.首先是LoadLibrary cocos2d中的C++代码会编译成一个.so文件.放在安卓文件夹下的libs/armeabi 下,然后java会load进来,这步我们不用做了,由于cocos2d已 ...
- android中使用jni对字符串加解密实现分析
android中使用jni对字符串加解密实现分析 近期项目有个需求.就是要对用户的敏感信息进行加密处理,比方用户的账户password,手机号等私密信息.在java中,就对字符串的加解密我们能够使用A ...
- cocos2d-x中使用JNI的调用JAVA方法
用cocos2d-x公布Android项目时.都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface).JNI是JAVA的一个通用接口.旨在本地化 ...
- 如何在cocos2d项目中enable ARC
如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...
- 如何在Cocos2D游戏中实现A*寻路算法(六)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在Cocos2D游戏中实现A*寻路算法(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- Android中关于JNI 的学习(一)对于JNIEnv的一些认识
一个简单的样例让我们初步地了解JNI的作用.可是关于JNI中的一些概念还是需要了解清楚,才干够更好的去利用它来实现我们想要做的事情. 那么C++和Java之间的是怎样通过JNI来进行互相调用的呢? 我 ...
- Android中关于JNI 的学习(四)简单的样例,温故而知新
在第零篇文章简单地介绍了JNI编程的模式之后.后面两三篇文章,我们又针对JNI中的一些概念做了一些简单的介绍,也不知道我究竟说的清楚没有.但相信非常多童鞋跟我一样.在刚開始学习一个东西的时候,入门最好 ...
随机推荐
- Ios8新特性-应用程序扩展
一.什么是应用程序扩展? 应用程序扩展不是一个应用,它是主体应用程序(containing app)中一个单独的包,并能生成单独的二进制文件供其他应用调用. 个人感觉,类似于WP中的启动器,把系统当个 ...
- IntelliJ IDEA 14 利用JRebel实现热部署 二
前言:今天下午和一个qq群里讨论JRebel时,忽然得到“自动部署”的奥秘--真有听君一席话,胜读十年书的感悟. 这是此群友的热部署博客:http://blog.csdn.net/martinkey/ ...
- JQuery,UIbootstrap风格弹出层
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...
- 【BZOJ】【2179】FFT快速傅里叶
FFT 做的第二道用到FFT的……好吧其实还是模板题-_-b 百度上说好像分治也能做……不过像FFT这种敲模板的还是省事=.= /*********************************** ...
- 无废话网页重构系列——(6)HTML主干结构:站点(site)、页面(page)
本文作者:大象本文地址:http://www.cnblogs.com/daxiang/p/4653546.html 在分析和切出设计稿,以及部署项目目录文件后,开始写HTML Demo. 首先,弄出H ...
- tornado的cookie和secure cookie
tornado里面有关几个cookie的处理,在web.py文件里. get_cookie, set_cookie普通的设置cookie, clear_cookie, clear_all_cookie ...
- MySQL 卸载 --Mac
pkill mysql sudo rm /usr/local/mysql sudo rm -rf /usr/local/mysql* sudo rm -rf /Library/StartupItems ...
- apache common-io.jar FileUtils
//复制文件 void copyFile(File srcFile, File destFile) //将文件内容转化为字符串 String readFileToString(File file ...
- [原创]使用命令行工具提升cocos2d-x开发效率(一)之TexturePacker篇
TexturePacker是一个常用的制作sprite sheet的工具,它提供了很多实用的功能. 一般我们制作sprite sheet都是使用他的gui版本,纯手工操作,就像下面这张图示的一样. 刚 ...
- 2008年我买了一本书 书名叫“PHP 6”
上个星期天,我感觉应该整理一下我的书柜.于是,在书柜里,我发现了一本几乎完全忘记的书(我想不起来为什么要买它!):<PHP 6 – 快速简洁的Web开发> 这本书出版于2008年一月.而六 ...