cocos2d-html5 javascript 通过C++绑定,调用java方法

1、java中的写法

/*
 * XConnectPlugin.java
 *
 *  Created on: 2014年4月30日
 *      Author: [email protected]
 */
package org.cocos2dx.commonSDK;

import android.util.Log;

public class XConnectPlugin {
	public static void start(String str) {
		Log.d("mylog ", "str>>" + str);
	}
}

2、C++中的写法

头文件(XInterface.h)声明方法:

/*
 * XInterface.h
 *
 *  Created on: 2014年4月30日
 *      Author: [email protected]
 */

#ifndef XINTERFACE_H_
#define XINTERFACE_H_

#include "string"

class XInterface {
public:
    static void start(const char* ct);
};

#endif /* XINTERFACE_H_ */

XInterface.cpp中写法:

/*
 * XInterface.cpp
 *
 *  Created on: 2014年4月30日
 *      Author: [email protected]
 */
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "XInterface.h"
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#include <android/log.h>
#include "ScriptingCore.h"

XInterface::XInterface() {
}

XInterface::~XInterface() {
}

const char* XJavaClassName = "org/cocos2dx/commonSDK/XConnectPlugin";

void XInterface::start(const char* cLevel) {
	JniMethodInfo t;
	if (JniHelper::getStaticMethodInfo(t, XJavaClassName, "start", "(Ljava/lang/String;)V")) {
		if (cLevel) {
			jstring jLevel = t.env->NewStringUTF(cLevel);
			t.env->CallStaticVoidMethod(t.classID, t.methodID, jLevel);
			t.env->DeleteLocalRef(jLevel);
		}
		t.env->DeleteLocalRef(t.classID);
	}
}

#endif

以上部分是C++调用到java的方法,start(string)。

3、以下部分是,在SpritMonkey中注冊C++方法到javascript中

js_bindings_X.cpp

/*
 * jsbindingsX.cpp
 *
 *  Created on: 2014年4月30日
 *      Author: [email protected]
 */

#include "ScriptingCore.h"
#include "XInterface.h"

JSBool JSB_X_start(JSContext *cx, uint32_t argc, jsval *vp){

	std::string str;
    if(argc == 1)
    {
        jsval *argv = JS_ARGV(cx, vp);
        jsval_to_std_string(cx, argv[0], &str);
        XInterface::start(str.c_str());
    }

	return JS_TRUE;
}

void register_X_js(JSContext* cx, JSObject* global){
	jsval nsval;
	JSObject *XJsbObject;

	JS_GetProperty(cx, global, "XJsb", &nsval);
	if (nsval == JSVAL_VOID) {
		XJsbObject = JS_NewObject(cx, NULL, NULL, NULL);
		nsval = OBJECT_TO_JSVAL(XJsbObject);
		JS_SetProperty(cx, global, "XJsb", &nsval);
	} else
		JS_ValueToObject(cx, nsval, &XJsbObject);

    JS_DefineFunction(cx, XJsbObject, "start", JSB_X_start, 1, JSPROP_READONLY | JSPROP_PERMANENT);
}

然后在javascript中,这样声明:

var XJsb = XJsb || {
	start : function () {
	}
};

注意。这里的XJsb跟c++ 中的register_x_js 保持一致.

然后在,须要调用的地方。触发:

XJsb.start("from javaScript");

须要注意,在AppDelegate.cpp中。增加

extern void register_X_js(JSContext* cx, JSObject* global);

 ScriptingCore* sc = ScriptingCore::getInstance();
sc->addRegisterCallback(register_X_js);

在Android.mk中的LOCAL_SRC_FILES加入:

LOCAL_SRC_FILES :=
                ../../Classes/XInterface.cpp                 ../../Classes/js_bindings_X.cpp 

最后的结果就出来了:from javaScript

时间: 2024-12-29 11:31:50

cocos2d-html5 javascript 通过C++绑定,调用java方法的相关文章

如何在android平台上使用js直接调用Java方法[转]

转载自:http://www.cocos.com/docs/html5/v3/reflection/zh.html #如何在android平台上使用js直接调用Java方法 在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parame

Js调用Java方法并互相传参

Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. import org.json.JSONArray; import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.DialogInterface; impor

C#调用Java方法

C#调用Java方法(详细实例) 阅读目录 C#调用c++ C#调用JAVA方法 C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方法转换成可以由C#直接调用的DLL 回到目录 C#调用c++ C#调用C++的例子网上很多,以一个C++的具体方法为例. C++代码 // 获取一帧图像数据 MVSMARTCAMCTRL_API int __stdcall MV_SC_GetOneFrame(IN void*

C#调用Java方法(详细实例)

C#调用c++ C#调用C++的例子网上很多,以一个C++的具体方法为例. C++代码 // 获取一帧图像数据MVSMARTCAMCTRL_API int __stdcall MV_SC_GetOneFrame(IN void* handle,                                                    IN OUT unsigned char *pData ,                                               

java native interface JNI 调用Java方法

在上一篇文章中介绍了JNI,以及java调用JNI,这篇讲一下 JNI调用java方法. 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函数.JNI通过ID识别域和方法,一个域或方法的ID是任何处理域和方法的函数的必须参数. 下表列出了用以得到静态(static)和实例(instance)的域与方法的JNI函数.每个函数接受(作为参数)域或方法的类,它们的名称,符号和它们对

cocos2d-x中使用JNI的调用JAVA方法

用cocos2d-x公布Android项目时.都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface).JNI是JAVA的一个通用接口.旨在本地化语言(如C\C++)与JAVA语言进行交互.在交互过程成中,JAVA调用的是已编译好的本地化语言的二进制代码(如Windows下的dll.Linux下的so文件).所以在交叉编译时看到Eclipse的控制台输出 [armeabi] SharedLibrary  : libcocos2dcpp.so

C++调用JAVA方法详解

C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++调用JAVA主要用到了SUN公司的JNI技术, JNI是Java Native Interface的 缩写.从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互.相关资料见http://java.su

PHP调用JAVA方法

1. PHP调用JAVA方法 1.1.  软件需求 下载php-java-bridge_6.2.1_documentation.zip,下载地址为: http://php-java-bridge.sourceforge.net/pjb/download.php JavaBridge.jar:将上面的php-java-bridge_6.2.1_documentation.zip解压得到一个JavaBridge.war,将JavaBridge.war重命名为JavaBridge.jar,再次用Win

Python调用java方法

需求 最近在后台项目代码中一段自定义的AES加解密的程序在平时的测试工作中应用频繁.因为写脚本经常会需要使用,而经过各种尝试,比如jpype等,都不尽如人意.最后转换思路找到了一种好方法: 1. 将java项目打成jar包: 2. 设定jar包的Main-class属性: 3. 在python中通过subprocess执行jar包. 修改main函数打jar包 在intellij中打jar包: 1. File--> Project Structure... --> Artifacts --&g

Android Studio NDK开发-JNI调用Java方法

相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需要先了解FindClass和GetMethodID了. FindClass和GetMethodID 在JNI中可以通过FindClass可以找到Java类,得到jclass,例如: jclass clz=(*env)->FindClass(env,"com/jjz/JniHandle"