cocos2dx-JniHelper 使用,在c++层面调用java层接口
JNI (java native interface) 字段描述符
|
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.androidjnihellocpp目录下,每加一个cpp文件,都需在proj.androidjni的Andriod.mk文件中添加:
LOCAL_SRC_FILES := hellocpp/main.cpp
hellocpp/test.cpp <--为新添加的 ...
3.跟jni相关的java代码文件放在proj.androidsrcjtSwordsMen目录下
一、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.androidsrcjtSwordsMenJniTestHelper.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.androidsrcjtSwordsMenJniTestHelper.java去掉proj.andriodsrc的部分
//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());
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
- Ajax前台返回JSON数据后再Controller中直接转换成类型使用,
- ruby – 关于链接多个any_of标准的问题#Mongoid
- iphone – XCode 5故事板内部不一致
- Oracle相当于MySQL INSERT IGNORE?
- [FD] Waiting for Flash Player to connect to debugger问题
- sqlite导入到mysql
- 在Notepad++中结合使用正则表达式及标记,可以事半功倍
- c# – 我如何处理ViewModel中的Validation.Error而不是后面
- JSONObject JSONArray使用备忘
- ruby-on-rails – 独角兽陷入困境:刷新宝石列表