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

相关推荐