原文链接: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方法互调)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)