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层接口相关推荐

  1. 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(上)

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/725.html ☞ ...

  2. cocos2d-x 通过JNI实现c/c++和Android的java层函数互调 .

    转载请注明来自:Alex Zhou的程序世界,本文链接:http://codingnow.cn/cocos2d-x/992.html 本文主要实现两个功能: (1)通过Android sdk的API得 ...

  3. cocos2d-x jni相关目录分析

    Game_______src(游戏逻辑c/c++代码) | |___proj.android(java工程文件夹)________jni(mk文件,java中使用的接口c/c++文件) | |___s ...

  4. NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM(方法签名,CallXXXMethod)

    NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM 题目有点复杂,不过确实就是那么回事.这章想记录的内容比较多,先列出来: native static 与 nat ...

  5. java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用

    在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...

  6. JNI通过线程c回调java层的函数

    1.参看博客:http://www.jianshu.com/p/e576c7e1c403 Android JNI 篇 - JNI回调的三种方法(精华篇) 2.参看博客: JNI层线程回调Java函数关 ...

  7. Android-JNI开发系列《二》-在jni层的线程中回调到java层

    人间观察 忽有故人心上头,回首山河已是秋. 马上国庆+中秋了--- 今天我们看一个比较常见的场景: 当我们处理一个密集型计算数据(比如音视频的软编解码处理,bitmap的特效处理等),这时候就需要用c ...

  8. 20 JNI - c++层 操作 java 层对象

    Android Ndk 学习笔记(目录) 1 1 int 基本类型 , String 引用对象类型, int[] array 类型 String [] 引用对象数组类型 public native v ...

  9. saf java_Android SAF实现外置SD卡的写入(JAVA层与JNI层hook)

    1. 前言 之前折腾了了一下MINE模拟器,发现SDL全是在JNI层fopen操作的,而安卓的SAF则是JAVA层通过DocumentFile和docUri来实现写入的.一种方法是通过去的File D ...

最新文章

  1. 如何配置能使j2me开发环境处于正常状态
  2. 虚拟目录和应用程序的区别
  3. Stanford UFLDL教程 可视化自编码器训练结果
  4. oracle 清理跟踪文件.trc .trm
  5. 从tensorflow的summary中提取数据,并进行平滑操作与显示
  6. C#创建Windows服务程序
  7. Awvs 12.x安装教程
  8. StreamSets实战之路(十五)-实战篇- 数据采集与处理
  9. 泰勒·斯威夫特(Taylor Swift)最好听歌曲专辑,喜欢的可以下载保存
  10. 网店系统SHOP++、V5shop、shopex全程分析比较
  11. 用freeswitch建立呼叫中心系统的经验
  12. Qt 小例子学习9 - 代码编辑器
  13. 振耀退休感言及海辉执行董事长视频访谈
  14. JAVA实现PDF无损转WORD
  15. 7个免费PDF转换软件推荐
  16. SolidWorks六角螺母添加倒角2种方法
  17. linux系统如何下游戏,海岛纪元干货 在Linux系统下如何畅玩游戏攻略
  18. 2019 最全神经网络结构图画图工具介绍,没有之一!
  19. C语言--bool型变量问题详解
  20. LNMP 架构部署(附:部署 Discuz 社区论坛 Web 应用)

热门文章

  1. 希尔排序(数据结构)
  2. 计算机组成原理-作业四
  3. 帝国CMS灵动标签栏目导航调用
  4. 如何用电脑键盘输入特殊符号
  5. Java常见命令之jps
  6. 微信小程序皮肤检测动态滑动展示效果
  7. 团队激励与沟通思维导图
  8. 实习半年了。干了这碗鸡汤。你就是我的狗了(随笔)
  9. Android平台HTTPS抓包解决方案及问题分析,深夜思考
  10. gensim使用之一 tfidf 和lsa