cocos2d-x中通过Jni实现Java与C++的互相调用。

cocos2d-x用开发者提供了一个类JniHelper,提供了java与c++之间互调的jni解决方案。

笔者所开发的“史上最坑爹的游戏”项目中使用到了JNI,为此专门定义了一个类JniUtil.

头文件JniUtil.h中需要引入如下两个.h文件:

#include

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

通过C++调用Java

声明一个函数,专门用于处理从C++调用Java的方法,所有调用Java的地方都走这个函数。

这样可以减少jni代码,通过Json来传递具体的调用指令,在java那边通过switch来进行区分,然后再通过java去调用具体的方法。

static void callJni(const char * data);

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

void JniUtil::callJni(const char *data){

JniMethodInfo minfo;//定义Jni函数信息结构体

//getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数

const char * jniClass = "com/xxxx/xxxx/xxxxxxxx";//这里写你所要调用的java代码的类名

bool isHave = JniHelper::getStaticMethodInfo(minfo,jniClass,"callJni","(Ljava/lang/String;)V");//本人在此传递的参数是字符串

if (!isHave) {

CCLog("jni->%s/callJni:此函数不存在", jniClass);

}else{

CCLog("jni->%s/callJni:此函数存在", jniClass);

jstring jdata = minfo.env->NewStringUTF(data);

//调用此函数

minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,jdata);

}

CCLog("jni-java函数执行完毕");

}

Java的实现:

public static void callJni(final String data) {

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

//这里处理C++传递过来的数据

}

}, 100);

}

通过Java代码调用C++

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

private static native void xxxxxx(int value);

在JniUtil.cpp中作如下实现:

extern "C"

{

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

void Java_com_xxxx_xxxx_xxxx_xxxx(JNIEnv*  env, jobject thiz, jint a)

{

//这里java调用nativePaySuccess(1);,这里就会被调用。jint a = 1

}

}

cocos2d-x 调用java_cocos2d-x中通过Jni实现Java与C++的互相调用相关推荐

  1. jni c java互相调用_通过JNI实现Java和C++的相互调用

    评论 # re: 通过JNI实现Java和C++的相互调用 2008-07-29 14:14 Always BaNg. 不错,把字符转换也一并讲了吧,比如UTF-8的处理,USC-2与MBCS转换等. ...

  2. java 调用c++ jni_Java中使用JNI调用C++

    1,JNI是什么? JNI即Java Native Interface(Java本地接口),是一个协议,主要作用为:实现Java调用c/c++代码(类库),或者C/C++调用Java代码 2,主要实现 ...

  3. Android JNI实现Java与C/C++互相调用,以及so库的生成和调用(JNI方式调用美图秀秀so)

    前言 关于Android Studio如何继承JNI开发环境,请阅读上一篇博文 Android CMake集成JNI开发环境本篇博文将结合实例分别讲解Android中Java如何调用C/C++的方法, ...

  4. 10.4.4 使用ctypes调用kernel32.dll中的函数

    10.4.4 使用ctypes调用kernel32.dll中的函数 2007-10-17 14:41 孙广磊 人民邮电出版社 字号:T | T 综合评级: 想读(5)  在读(0)  已读(6)   ...

  5. Java基于VB通过Jacob调用AutoCAD接口

    Java 以跨平台深受大家喜欢,而由于它跨平台的目的,需要运行在java虚拟机上工作,使得它和本地机器各种内部联系变得很少,约束了它直接掉本地API的功能.本例采用VB代码生成调用AutoCAD接口的 ...

  6. 外汇汇率接口 java_基于java的货币汇率接口调用代码实例

    基于java的货币汇率接口调用代码实例 基于JAVA 的货币汇率接口调用代码实例 代码描述:基于JAVA 的货币汇率接口调用代码实例 代码平台:聚合数据 import java.io.Buffered ...

  7. java 调用cpp_java jni 调用cpp文件中的方法 | 学步园

    这里说下最近修改nutch的源码碰到的调用cpp文件中的方法. 刚刚开始的时候,想直接在fetch.java中直接写jni接口.后来发现这样会留下不好的编程习惯.自己动手在fetch下写一个类.Hel ...

  8. java调用jni接口,Java 中通过jni接口调用native code

    [    Java语言本身是通过Java的虚拟机解释执行的,因此对于Java中调用本地动态链接库的问题便提上了日程,为何会存在这样的需求呢?因为Java本身的机制导致一些要求高效率 在上上篇中已经介绍 ...

  9. 如何通过JNI在Java中调用C库函数

    使用Java语言进行开发时,可能由于处理速度.硬件控制或者复用既有的C/C++模块等方面的原因,需要Java层与使用C/C++编写的应用.模块或库进行交互,共同完成某些任务.在两者之间充当连接桥梁作用 ...

最新文章

  1. Codeforces Round #648 (Div. 2)题解 A-D
  2. python类中init_Python类中的__init__() 和 self 的解析
  3. 什么是面向对象_什么是面向对象?新手程序员必掌握的技能
  4. 作业调度C语言编写,【作业调度方案】 (C语言代码)
  5. 图像处理-RGB24转YUV420遇到的坑以及执行效率对比
  6. 一起自学SLAM算法:写在前面
  7. Java是如何存储元素的(3)—Map集合存储数据原理(为什么HashMap集合的key部分的特点是无序,不可重复)
  8. (多元)偏正态分布、正态分布、对数正态分布的随机数的产生(R语言)
  9. 英语翻译作业(十二)
  10. 以太网的网络电缆线被拔出怎么解决
  11. 用python实现分段函数_python:集成分段函数
  12. Pytorch:NLP 迁移学习、NLP中的标准数据集、NLP中的常用预训练模型、加载和使用预训练模型、huggingface的transfomers微调脚本文件
  13. 及时止损真的正确吗?
  14. 环境监测历史数据(AQI历史数据)
  15. Python - Requests库下载图片
  16. 韩老师——数据结构与算法—单链表的生成及增删改查操作和常见关于链表的面试题java代码实现
  17. 微信公众号关于百度地图和腾讯地图本地定位api的调用(js)
  18. Whistle 抓包简易教程
  19. 有史以来关于Flash Player的最详细说明
  20. SQL SERVER 获得一个月有多少天 的函数例子

热门文章

  1. 致命错误: 在类路径或引导类路径中找不到程序包 java.lang_如何提升店铺动态评分 需要提升可以找我...
  2. 牛年春节与年俗插画素材,年味十足
  3. C4D电商促销素材模板,让你的工作效率更加高效​!
  4. href标签带上了localhont地址怎么删除_如何找回删除的微信好友?
  5. webstorm代码行数统计_来测试下 2019 你一共写了多少行代码?
  6. cuSPARSE库:(二)静态库的支持
  7. Linux开机启动过程(4):切换到64位模式-长模式(直到内核解压缩之前)
  8. Linux网络协议栈:一个TCP链接的耗时
  9. Docker资源汇总
  10. 一个简单的状态机设计