cocos2dx jni 调用java_cocos2dx-JniHelper 使用,在c++层面调用java层接口
JNI (java native interface) 字段描述符
“([Ljava/lang/String;)V” 它是一种对函数返回值和参数的编码。这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors)。一个数组int[],就需要表示为这样"[I"。如果多个数组double[][][]就需要表示为这样 "[[[D"。也就是说每一个方括号开始,就表示一个数组维数。多个方框后面,就是数组 的类型。
如果以一个L开头的描述符,就是类描述符,它后紧跟着类的字符串,然后分号“;”结束。
比如"Ljava/lang/String;"就是表示类型String;
"[I"就是表示int[];
"[Ljava/lang/Object;"就是表示Object[]。
JNI方法描述符,主要就是在括号里放置参数,在括号后面放置返回类型,如下:
(参数描述符)返回类型
当一个函数不需要返回参数类型时,就使用”V”来表示。
比如"()Ljava/lang/String;"就是表示String f();
"(ILjava/lang/Class;)J"就是表示long f(int i,Class c);
"([B)V"就是表示void String(byte[] bytes);
@H_403_34@
Java 类型
符号
Boolean
Z
Byte
B
Char
C
Short
S
Int
I
Long
J
Float
F
Double
D
Void
V
objects对象
以"L"开头,以";"结尾,中间是用"/" 隔开的包及类名。比如:Ljava/lang/String;如果是嵌套类,则用$来表示嵌套。例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z"
另外数组类型的简写,则用"["加上如表A所示的对应类型的简写形式进行表示就可以了,
比如:[I 表示 int [];[L/java/lang/objects;表示Objects[],另外。引用类型(除基本类型的数组外)的标示最后都有个";"
例如:
"()V" 就表示void Func();
"(II)V" 表示 void Func(int,int);
"(Ljava/lang/String;Ljava/lang/String;)I".表示 int Func(String,String)
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 #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,finalString text) { Message msg =mHandler.obtainMessage(); msg.what =SwordsMen.SHOW_DIALOG; DialogMessage dm = newDialogMessage(); 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 voidCMainScene::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); } voidexitApp() { CCDirector::sharedDirector()->end(); }
2.Andriod工程中的声明(JniTestHelper.java):
public static native voidsetPackageName(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());
cocos2dx jni 调用java_cocos2dx-JniHelper 使用,在c++层面调用java层接口相关推荐
- 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(上)
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/725.html ☞ ...
- cocos2d-x 通过JNI实现c/c++和Android的java层函数互调 .
转载请注明来自:Alex Zhou的程序世界,本文链接:http://codingnow.cn/cocos2d-x/992.html 本文主要实现两个功能: (1)通过Android sdk的API得 ...
- cocos2d-x jni相关目录分析
Game_______src(游戏逻辑c/c++代码) | |___proj.android(java工程文件夹)________jni(mk文件,java中使用的接口c/c++文件) | |___s ...
- NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM(方法签名,CallXXXMethod)
NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM 题目有点复杂,不过确实就是那么回事.这章想记录的内容比较多,先列出来: native static 与 nat ...
- java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用
在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...
- JNI通过线程c回调java层的函数
1.参看博客:http://www.jianshu.com/p/e576c7e1c403 Android JNI 篇 - JNI回调的三种方法(精华篇) 2.参看博客: JNI层线程回调Java函数关 ...
- Android-JNI开发系列《二》-在jni层的线程中回调到java层
人间观察 忽有故人心上头,回首山河已是秋. 马上国庆+中秋了--- 今天我们看一个比较常见的场景: 当我们处理一个密集型计算数据(比如音视频的软编解码处理,bitmap的特效处理等),这时候就需要用c ...
- 20 JNI - c++层 操作 java 层对象
Android Ndk 学习笔记(目录) 1 1 int 基本类型 , String 引用对象类型, int[] array 类型 String [] 引用对象数组类型 public native v ...
- saf java_Android SAF实现外置SD卡的写入(JAVA层与JNI层hook)
1. 前言 之前折腾了了一下MINE模拟器,发现SDL全是在JNI层fopen操作的,而安卓的SAF则是JAVA层通过DocumentFile和docUri来实现写入的.一种方法是通过去的File D ...
最新文章
- 如何配置能使j2me开发环境处于正常状态
- 虚拟目录和应用程序的区别
- Stanford UFLDL教程 可视化自编码器训练结果
- oracle 清理跟踪文件.trc .trm
- 从tensorflow的summary中提取数据,并进行平滑操作与显示
- C#创建Windows服务程序
- Awvs 12.x安装教程
- StreamSets实战之路(十五)-实战篇- 数据采集与处理
- 泰勒·斯威夫特(Taylor Swift)最好听歌曲专辑,喜欢的可以下载保存
- 网店系统SHOP++、V5shop、shopex全程分析比较
- 用freeswitch建立呼叫中心系统的经验
- Qt 小例子学习9 - 代码编辑器
- 振耀退休感言及海辉执行董事长视频访谈
- JAVA实现PDF无损转WORD
- 7个免费PDF转换软件推荐
- SolidWorks六角螺母添加倒角2种方法
- linux系统如何下游戏,海岛纪元干货 在Linux系统下如何畅玩游戏攻略
- 2019 最全神经网络结构图画图工具介绍,没有之一!
- C语言--bool型变量问题详解
- LNMP 架构部署(附:部署 Discuz 社区论坛 Web 应用)