cocos2d-x中的Jni使用(C++与Andriod方法互调)

前端之家收集整理的这篇文章主要介绍了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,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(char *msg)
{
  JniMethodInfo t;
  //getStaticMethodInfo判断是否在java中实现了名字showTipDialog的方法
  //"(Ljava/lang/String;Ljava/lang/String;)V" 对该方法的一个描述,详见说明
  if(JniHelper::getStaticMethodInfo(t,CLASS_NAME,showTipDialog",0); line-height:1.5!important">(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,255); line-height:1.5!important">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(Promptif 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.hvoid setPackageName(char *packageName)
{
    CCLog(packageName: %s",packageName);  
}

void exitApp()
{
    CCDirector::sharedDirector()->end();
}
2.Andriod工程中的声明(JniTestHelper.java):

public native void setPackageName(String packageName); 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)
{ 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());		



对于参数的意思以下有详细说明:

来源文件:http://fgsink.blog.163.com/blog/static/16716997020124310169911/

“([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)

猜你在找的Cocos2d-x相关文章