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_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

更多相关文章

  1. ArcGIS for Android示例解析之GP服务调用-----ViewShed
  2. 使用Kotlin开发Android(安卓)扩展函数(Extensions)
  3. [Android]Ams 广播发送原理(三)
  4. Android(安卓)ApiDemos示例解析(55):Graphics->BitmapMesh
  5. Android(安卓)Audio System 之三: AudioPolicyService 和 AudioPo
  6. Android源码分析:VoIP
  7. Android(安卓)ApiDemos示例解析(149):Views->Layouts->LinearLay
  8. android ContextMenu 上下文菜单示例
  9. Linux基本知识(四):Android常用自动化命令

随机推荐

  1. 【Android开发】Android入门安装与使用教
  2. App for Android (2) —— Python篇
  3. Android中的Toast的标准格式和自定义格式
  4. EditText属性及一些常用用法
  5. 【Android性能优化】使用NDK进行Java和C+
  6. 一文彻底搞懂Android(安卓)View的绘制流
  7. AIDL(android 接口描述语言)
  8. 用Eclipse开发和调试Android应用程序(一)
  9. Android的电源管理
  10. Android(安卓)-- 系统进程Zygote的启动分