cocos2dx中利用xcode 调用java中的函数
1.
先把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_BEGIN typedef 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