cocos2dx中利用xcode 调用java中的函数
16lz
2021-01-26
1.
先把cocos2dx根目录中的
/Users/zhaoshun/cocos2dx/cocos2d-2.0-x-2.0.4/cocos2dx/platform/android 目录
拷贝到 xcode项目的
工程根目录/libs/cocos2dx/platform 目录下
2.
在xcode工程中
文件开头加入 预编译
。。。。。。代码
3.
在cocos2dx方法中 调用java方法
比如
函数的签名可以使用如下命令获取
4. JniHelper.h文件 讲解
此文件在 cocos2dx跟目录/cocos2dx/cocos2dx/platform/android/jni/JniHelper.h
内容
先把cocos2dx根目录中的
/Users/zhaoshun/cocos2dx/cocos2d-2.0-x-2.0.4/cocos2dx/platform/android 目录
拷贝到 xcode项目的
工程根目录/libs/cocos2dx/platform 目录下
2.
在xcode工程中
文件开头加入 预编译
//使用预编译,对当前平台为Android时才会导入如下头文件#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include <jni.h>#include "platform/android/jni/JniHelper.h"#include <android/log.h>
。。。。。。代码
#endif
3.
在cocos2dx方法中 调用java方法
比如
void HelloWorld::menuCloseCallback(CCObject* pSender){ ////静态函数示例1.无参数,无返回值#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 JniMethodInfo minfo;//定义Jni函数信息结构体 //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数 bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/example/testGame/testGame","testFun", "()V"); if (!isHave) { CCLog("jni:此函数不存在"); }else{ CCLog("jni:此函数存在"); //调用此函数 minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID); } CCLog("jni-java函数执行完毕");#endif}
函数的签名可以使用如下命令获取
javap -s 包名 类名 可以显示函数的签名 到bin的classes目录
4. JniHelper.h文件 讲解
此文件在 cocos2dx跟目录/cocos2dx/cocos2dx/platform/android/jni/JniHelper.h
内容
#ifndef __ANDROID_JNI_HELPER_H__#define __ANDROID_JNI_HELPER_H__#include <jni.h>#include <string>#include "platform/CCPlatformMacros.h"NS_CC_BEGINtypedef struct JniMethodInfo_{ JNIEnv * env; jclass classID; jmethodID methodID;} JniMethodInfo;class CC_DLL JniHelper{public: static JavaVM* getJavaVM(); static void setJavaVM(JavaVM *javaVM); static const char* getExternalAssetPath(); static void setExternalAssetPath(const char* externalAssetPath); static jclass getClassID(const char *className, JNIEnv *env=0); static bool getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode); static bool getMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode); static std::string jstring2string(jstring str);private: static JavaVM *m_psJavaVM; static std::string m_externalAssetPath;};NS_CC_END#endif // __ANDROID_JNI_HELPER_H__
// 静态函数示例1.无参数,无返回值public static void testFun() { Log.e("Himi", "静态函数示例1.无参数,无返回值");}// 静态函数示例2.有参数,无返回值public static void testFunWithInt(int _int) { Log.e("Himi", "静态函数示例1.有参数,无返回值;传入的参数int=" + _int);}// 静态函数示例3.有参数,有返回值public static int testFunWithIntAndRtn(int _int) { Log.e("Himi", "静态函数示例1.有参数,有返回值;传入的参数int=" + _int); return _int+1000;}// 静态函数示例4.有参数,有返回值(String类型)public static String testFunWithStringAndRtn(int _int) { Log.e("Himi", "静态函数示例4.有参数,有返回值(String类型);int=" + _int); return "yes,return 'String' is OK --by Himi";}//---- 函数示例之非静态函数调用//(先获取个对象)public static Activity actInstance;//定义单例public static Object rtnActivity() { return actInstance;}//使用此对象进行调用非静态函数public void nostaticFun() { Log.e("Himi", "no static Function is OK - By Himi");}
////静态函数示例1.无参数,无返回值//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台// JniMethodInfo minfo;//定义Jni函数信息结构体// //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数// bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/example/testGame/testGame","testFun", "()V");// // if (!isHave) {// CCLog("jni:此函数不存在");// }else{// CCLog("jni:此函数存在");// //调用此函数// minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);// }// CCLog("jni-java函数执行完毕");//#endif ////静态函数示例2.有参数,无返回值//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台// JniMethodInfo minfo;//定义Jni函数信息结构体// //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数// bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/example/testGame/testGame","testFunWithInt", "(I)V");// // if (!isHave) {// CCLog("jni:此函数不存在");// }else{// CCLog("jni:此函数存在");// //调用此函数 第三个参数为 传入的值// minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,888);// }// CCLog("jni-java函数执行完毕");//#endif // //静态函数示例3.有参数,有返回值--------------------------------$$$$$$$--------------------------------//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台// JniMethodInfo minfo;//定义Jni函数信息结构体// //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数// // bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/example/testGame/testGame","testFunWithIntAndRtn","(I)I");// jint _int;// if (!isHave) {// CCLog("jni:此函数不存在");// }else{// CCLog("jni:此函数存在");// //调用此函数// _int = minfo.env->CallStaticIntMethod(minfo.classID, minfo.methodID,823);// // //尝试jint是否能正常接收返回的int值// JniMethodInfo minfo_ty;// bool isHave = JniHelper::getStaticMethodInfo(minfo_ty, "com/example/testGame/testGame", "testFunWithInt", "(I)V");// if (isHave) {// minfo_ty.env->CallStaticVoidMethod(minfo_ty.classID, minfo_ty.methodID,_int);// }// // }// CCLog("jni-java函数执行完毕");//#endif//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台// JniMethodInfo minfo;//定义Jni函数信息结构体// //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数// bool isHave = JniHelper::getStaticMethodInfo(minfo, "com/example/testGame/testGame","testFunWithStringAndRtn","(I)Ljava/lang/String;");// jobject jobj;// if (!isHave) {// CCLog("jni:此函数不存在");// }else{// CCLog("jni:此函数存在");// //调用此函数// jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID,823);// }// CCLog("jni-java函数执行完毕");//#endif //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台// JniMethodInfo minfo;//定义Jni函数信息结构体// //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数// bool isHave = JniHelper::getStaticMethodInfo(minfo,// "com/example/testGame/testGame", //类的路径// "rtnActivity", //方法名// "()Ljava/lang/Object;"); //括号里的是参数,后面的是返回值。// jobject jobj;// if (isHave) {// jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);// }// CCLog("正确获取到 jobj");// // //// isHave = JniHelper::getMethodInfo(minfo,// "com/example/testGame/testGame", //类的路径// "nostaticFun", //方法名// "()V"); //括号里的是参数,后面的是返回值。// // if (isHave) {// minfo.env->CallVoidMethod(jobj, minfo.methodID);// }// CCLog("jni-java函数执行完毕");//#endif
更多相关文章
- ArcGIS for Android示例解析之GP服务调用-----ViewShed
- 使用Kotlin开发Android(安卓)扩展函数(Extensions)
- [Android]Ams 广播发送原理(三)
- Android(安卓)ApiDemos示例解析(55):Graphics->BitmapMesh
- Android(安卓)Audio System 之三: AudioPolicyService 和 AudioPo
- Android源码分析:VoIP
- Android(安卓)ApiDemos示例解析(149):Views->Layouts->LinearLay
- android ContextMenu 上下文菜单示例
- Linux基本知识(四):Android常用自动化命令