Cocos2d-x与Android交互(c++与java互调),与IOS交互(c++与objective c混编)

来源:互联网 发布:部落冲突防空升级数据 编辑:程序博客网 时间:2024/05/18 21:09


1、       与Android交互(c++与java互调)

先看看jni签名吧

具体的对应关系见下面两张图:



数组则以”["开始,用两个字符表示



Lfull-qualified-class        full-qualified-class

 

 

如果调用java里面一个方法比如: public String method(String str , int[] i);

则对应的签名方法是:”(Ljava/lang/String;[I]Ljava/lang/String;”

 

数据类型转换:

      在java层调用native函数传递到JNI层的参数,JNI层会做一些特殊处理,我们知道java数据类型分为基本数据类型和引用数据类型两种,JNI层也是区别对待的。下表示出了java数据类型—>native类型的转换。



开始实际操作

新建一个专门放调用java的文件

JniTest.h

#ifndef __MyGame__JniTest__#define __MyGame__JniTest__//声明用C编译器编译extern "C"{    void showDialogAndroid(const char* title , const char* message);}#endif /* defined(__MyGame__JniTest__) */

JniTest.cpp

#include "cocos2d.h"//将所有代码包含在预编译块里,防止找不到<jni.h>报错#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)#include "JniTest.h"#include <jni.h> //这个文件在ndk中,所以放在预编判断块中,不然编译器找不到这个文件会报错#include "platform/android/jni/JniHelper.h"USING_NS_CC;extern "C"{//MARK: ==c++ call javavoid showDialogAndroid(const char* title , const char* message){        JniMethodInfo minfo;        bool isHave = JniHelper::getStaticMethodInfo(minfo,"org/cocos2dx/cpp/Cocos2dxActivity","getInstance", "()Lorg/cocos2dx/cpp/Cocos2dxActivity;");        jobject jobj;        if (isHave)        {            jobj=minfo.env->CallStaticObjectMethod(minfo.classID,minfo.methodID);//获取对象实例            isHave=JniHelper::getMethodInfo(minfo,"org/cocos2dx/cpp/Cocos2dxActivity","dlg", "(Ljava/lang/String;Ljava/lang/String;)V");            if(isHave)            {                jstring str1=minfo.env->NewStringUTF(title);                jstring str2=minfo.env->NewStringUTF(message);                minfo.env->CallVoidMethod(jobj,minfo.methodID,str1,str2);                minfo.env->DeleteLocalRef(str1);                minfo.env->DeleteLocalRef(str2);            }        }}//MARK: ==java call c++//java传入一个string,无返回值,严格按照这个格式JAVA_方法路径【以_隔开】(JNIENV* env,jobject this,方法参数)    void  Java_org_cocos2dx_cpp_Cocos2dxActivity_callC(JNIEnv *env, jobject thiz, jstring name)    {        const char *pkgName = env->GetStringUTFChars(name, NULL);        setPackageName(pkgName);        env->ReleaseStringUTFChars(name, pkgName);        CCLOG("java call c++函数执行完毕");    }}#endif

然后再看一下包名结构



然后再要使用的时候包含头文件,调用这个方法,具体代码请下载来看,文章结尾有链接

#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)    #include "JniTest.h"#elif (CC_TARGET_PLATFORM==CC_PLATFORM_IOS)    #include "OCTest.h"#endifvoid HelloWorld::jniCallBack1(Ref *pSender){    CCLOG("jniCallBack1");#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)    //jniTest1();    showDialogAndroid("hello" , "Mr. Yang");#elif (CC_TARGET_PLATFORM==CC_PLATFORM_IOS)    showDialog("hello" , "Mr. Yang");#endif}

效果图



2、与IOS交互(c++与objective c混编)

与ios的交互比较简单,直接新建一个object c文件,然后将实现文件xxx.m后缀名.m改为.mm,也就是xxx.mm,编译器就知道这个是混编文件了。例如

 

OCTest.h

void showDialog(const char* title , const char* message);

OCTest.mm

OCTest.mm#import "OCTest.h"#import <UIKit/UIKit.h>void showDialog(const char* title , const char* message){        NSString * tmpTitle = (title) ? [NSString stringWithUTF8String : title] : nil;        NSString * tmpMsg = (message) ? [NSString stringWithUTF8String : message] : nil;        UIAlertView * messageBox = [[UIAlertView alloc] initWithTitle: tmpTitle                                                              message: tmpMsg                                                             delegate: nil                                                    cancelButtonTitle: @"OK"                                                    otherButtonTitles: nil];        [messageBox autorelease];        [messageBox show];    }然后再要使用的时候包含头文件,调用这个方法#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)    #include "JniTest.h"#elif (CC_TARGET_PLATFORM==CC_PLATFORM_IOS)    #include "OCTest.h"#endifvoid HelloWorld::jniCallBack1(Ref *pSender){    CCLOG("jniCallBack1");#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)    //jniTest1();    showDialogAndroid("hello" , "Mr. Yang");#elif (CC_TARGET_PLATFORM==CC_PLATFORM_IOS)    showDialog("hello" , "Mr. Yang");#endif}

效果图



具体的代码请下载这个文件,里面有更详细的jni使用方法,包括传递基本数据类型,返回基本数据类型的值,及类型的转换。

传送门:http://download.csdn.net/detail/yangxuan0261/7288223


0 0
原创粉丝点击