cocos2dx-JniHelper 使用,在c++层面调用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);


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 <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,2); #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相关文章