cocos2dx中利用xcode 调用java中的函数

30 篇文章 0 订阅
29 篇文章 0 订阅
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值