Cocos2d-x通过Jni实现C++与Java相互调用

在cocos2dx项目中与运营平台(java sdk)对接时使用了JNI。

通过C++调用Java

在JniUtil.h文件中如下实现:

#ifndef  _JNIUTIL_H_
#define  _JNIUTIL_H_

class JniUtil
{
public:
    void static login(const char* zoneId, const char* zoneName);
};

#endif // _JNIUTIL_H_

在JniUtil.cpp文件中如下实现:

#include "JniUtil.h"

#include <jni.h>
#include "platform/android/jni/JniHelper.h"

void JniUtil::login(const char* zoneId, const char* zoneName)
{
    JniMethodInfo minfo;
    if (JniHelper::getStaticMethodInfo(minfo,
        "com/platform/test/JniUtil",
        "login",
        "(Ljava/lang/String;Ljava/lang/String;)V"))
    {
        jstring jzoneId = minfo.env->NewStringUTF(zoneId);
        jstring jzoneName = minfo.env->NewStringUTF(zoneName);
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, jzoneId, jzoneName);

        minfo.env->DeleteLocalRef(minfo.classID);
        minfo.env->DeleteLocalRef(jzoneId);
        minfo.env->DeleteLocalRef(jzoneName);
    }
}

Java的实现:

package com.platform.test;

public class JniUtil {
    private static void login(String zoneId, String zoneName) {
        // do
    }
}

通过Java调用C++

在java的JniUtil类中定义一个方法,用于提供给java调用C++:

package com.platform.test;

public class JniUtil {
    public static native void onLogin(String result);
}

在JniUtil.cpp文件中如下实现:

方法名与java类中的包名+方法名,以下划线连接

extern "C"
{
    void Java_com_platform_test_JniUtil_onLogin(JNIEnv*  env, jobject thiz, jint jresult)
    {
    const char* result = env->GetStringUTFChars(jresult, NULL);
    CCLOG("onLogin : %s", result);
    env->ReleaseStringUTFChars(jresult, result);
    }
}

一看就明白怎么调用,不过多解释

时间: 2024-10-11 05:59:28

Cocos2d-x通过Jni实现C++与Java相互调用的相关文章

JNI编程(二) —— 让C++和Java相互调用(1)

自己在外面偷偷的算了下,又有将近两个月没更新过blog了.趁着今天有兴致,来更新JNI编程的第二篇文章.在第一篇里,大概介绍了JNI的特点.用途和优劣.并且做一个最简单的JNI的例子,不过说实话那个例子在实际的开发中没有太大的价值,实际开发中所需要的JNI程序要远远比那个复杂.所以这一篇就来介绍下如何通过JNI实现java和C++的相互通信,来满足实际开发的需要. 所谓”通信“,其实说白了无非也就是我们所说的方法调用,在上一篇的例子里介绍了如何在Java中调用本地的DLL,其实在Java代码中,

JNI编程(二) —— 让C++和Java相互调用(2)

3.getRamdomOrder() 这个方法会从backend得到一个随机的Order对象(抱歉这里“Random”拼错了),然后再调用java中相应的通知方法来通知foreground.getRamdomOrder方法没有参数,但是所对应的C++方法里却有两个参数,一定有人会不解.其实细心的朋友一定会发现,JNI里所有对应Java方法的C++ 方法都会比Java方法多两个参数,第一个参数是我们很熟悉的JNIEnv*指针,第二个参数有时是jobject有时是个jclass.针对这第二个参数在这

TS与JAVA相互调用(TS篇)

一 : TS调用JAVA window["WebViewJavascriptBridge"].callHandler( 'enterGame' , JSON.stringify($param) , function(responseData) { // document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseD

cocos2d JS 基础语法间的函数方法相互调用

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } 1.函数嵌套函数 1 function calcuate(opr, a, b) { // 定义函数,opr - -> 符号,a,b - -> 数值 2 3 //定义 + 函数 4 function add(a, b){ 5 return a + b; 6 } 7 8 //定义 - 函数 9 function sub(a, b){ 10 r

.Net 与 Java 的服务接口相互调用

本文介绍.Net 与 Java 相互调用的例子.下面的介绍主要包括三方面:一是通过常用Web服务进行相互调用,二是使用TCP/IP套接字进行相互调用,三是使用Remote实现远程对象相互调用. 首先说一下Web服务的来源,Web服务是一种新的Web应用程序分支,可以执行从简单的请求到复杂商务处理等任何功能.一旦部署以后,其他Web服务应用程序可以发现并调用它部署的服务. Web Service是一种应用程序,它可以使用标准的互联网协议,像超文件传输协议(HTTP).简单对象访问协议(SOAP).

cocos2d 中使用jni C++ 调用 Java 方法

1.简单数据类型例子 假设我们Java中有这么一个open的静态方法,它没有参数,有一个int的返回值.怎么在C++中调用它呢? package cb.CbCCBLE; public class CbCCBLECentralManager { public static final String TAG = "CbCCBLECentralManager Android"; public static int open() { Log.d(TAG,"open"); r

cocos2d 中使用jni Java 调用 C++ 方法

1.首先是LoadLibrary cocos2d中的C++代码会编译成一个.so文件,放在安卓目录下的libs/armeabi 下,然后java会load进来,这步我们不用做了,因为cocos2d已经帮我们做好了. package cb.CbCCBLE; public class CbCCBLECentralManager { public static final String TAG = "CbCCBLECentralManager Android"; public native

Java通过jni技术支持c、c++调用使用整理

最近在公司搞终端5.0,说要对c++版本sdk封装一个java版的sdk,可是团队没有搞java的,于是赶鸭子上架,临时学习几天,整了一下:感觉还挺有意思的,于是整理一下: 为什么要使用java支持对c.c++的调用? 众所周知Java语言是一门支持跨平台解释型语言:#.java通过javac编译生成生成#.class字节码,运行过程依赖java虚拟机执行字节码生成虚拟机的执行指令,最终通过虚拟机操控所在平台,完成其设计的功能:其优点很明显,支持跨平台:其缺点也很明显,执行效率底,并且不支持平台

(转)java 层调用Jni(Ndk) 持久化c c++ 对象

对于Jni(Ndk) 很多人应该都有印象,Android的ndk接触到的机会相对会比较多,本例子以android平台为例,pc端的话就以简单的windows为例, 编码完用vs 或是 gcc进行编译成dll文件,扔到系统system32 , 就是环境变量配置的文件夹底下,linux 可能也差不多是这个意思,剩下的代码就跟android一样,进行加载这个动态链接库即可. 这里就不做赘述,直接进入android平台的ndk开发,这里就主要讲下,Java层如何持久化c c++ 对象,场景可以是这样,假