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
- Cocos2d-x与Android交互(c++与java互调),与IOS交互(c++与objective c混编)
- iOS Objective-C与JavaScript的交互
- iOS js与objective-c的交互
- 【iOS】Objective-C与JavaScript的交互
- iOS Objective-C与JS交互
- Objective-c与javascript交互
- Objective-c与JS交互
- Objective-c与javascript交互
- objective-c与javascript交互
- javaScript与Objective-C交互
- Objective-c与js交互
- swift与objective-c混编
- Objective-C 与 Swift 混编
- java与c的交互
- Swift与Objective-C API交互(二)
- Swift与Objective-C API交互(三)
- UIWebView 与 JS 交互(1):Objective-C 调用 Javascript
- Objective-C与JavaScript的交互
- 数据结构学习笔记之堆栈
- SSH+Oracle 整合错误之5 问题好像吃了炫迈 ,根本停不下来 java.util.NoSuchElementException
- java-IO流
- tomcat eclipse無法自動刷新jsp頁面
- 最大独立集问题
- Cocos2d-x与Android交互(c++与java互调),与IOS交互(c++与objective c混编)
- 【剑指offer】和为定值的两个数
- Javascript 对象方式实现命名参数调用(上):原理和手动实现
- 【存储管理】内核缓冲区的管理概述
- 响应式 jQuery Slider 插件: bxSlider
- DAY20--java中的反射机制常用知识点总结
- Wikioi 1297硬币 (二维完全背包)
- Bash的例子
- DAY21--java中的网络编程TCP/IP常用知识点总结