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

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

概述原文链接: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 :

原文链接: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"#endifvoid 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中的Jni使用(C++与Andriod方法互调)全部内容,希望文章能够帮你解决cocos2d-x中的Jni使用(C++与Andriod方法互调)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1045454.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存