cocos2d-x开发中jni相关记录

2023-10-27

使用加载的uijson文件中的按钮时,在按钮的响应函数里面删除掉(this->removeFromParent();)ui所在的层时,发生崩溃。解决办法:修改UIWidget.cpp文件中releaseUpEvent函数,如图:

 

1、在cocos2d-x的安卓java代码中调用c++的方法:

    第一,首先在项目下->src->包名,右键->New->Class,创建一个java类,此类中声明了需要调用的c++库xx.so导出函数。例如输入:

package com.example.firstandroid;

public class CHello {

    public native String getString();

    public static native int getNUm();

    static{

        System.loadLibrary("cppTest");

    }

}

    第二,选中项目,右键->Android Tools->Add Native Support,然后输入.so的名称,自动生成jni目录;目录下有2个文件Android.mk,xxx.cpp。mk文件中看到模块名称以及对应的cpp,可以允许多个cpp,使用空格或者\换行符。

    第三,再进入cmd,进入到工程名\bin\classes下,输入命令javah -d ../../jni –jni com.example.firstandroid.CHello,将会在jni目录下产生com_example_firstandroid_CHello.h,其中根据之前创建的java类声明了c++类。接下来,在jni下面的xxx.cpp中编写具体函数的实现。例如:

#include <jni.h>

#include "com_example_firstandroid_CHello.h"

/*

 * Class:     com_example_firstandroid_CHello

 * Method:    getString

 * Signature: ()Ljava/lang/String;

 */

jstring Java_com_example_firstandroid_CHello_getString

  (JNIEnv *env, jobject obj)

{

    return env->NewStringUTF("Hello Java");

}

/*

 * Class:     com_example_firstandroid_CHello

 * Method:    getNUm

 * Signature: ()I

 */

jint Java_com_example_firstandroid_CHello_getNUm

  (JNIEnv *env, jclass clas)

{

    return 0;

}

    C++库已经写好了,现在到主activity中去调用。例如添加:

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        CHello h = new CHello();

        System.out.println(h.getString());

    }

直接run as,android application就可以了,在LoaCat中可以看到,程序运行起来后打印了“Hello Java”。

注意:有一个问题就是,好像Add Native Support选项只能被选择一次,就是添加一次jni之后就不能再添加了。

2、在cocos2dx中c++代码调用java代码的方法:

在TaFang工程->src->org.cocos2dx.cpp下面,创建java类Tools,输入:

package org.cocos2dx.cpp;

import android.content.Context;

import android.os.Handler;

import android.os.Message;

import android.widget.Toast;

public class Tools {

    private static Context context = null;

    public static void init(Context context){

        Tools.context  = context;

    }

    public static void showToast(String msg){

        // Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); // 不能直接在这里调用,因为android线程不允许其他线程调用

        Message m = new Message();

        m.obj = msg;

        handler.sendMessage(m);

    }

    private static final Handler handler = new Handler(){

        public void handlerMessage(android.os.Message msg){

            Toast.makeText(context, (String)msg.obj, Toast.LENGTH_SHORT).show();

        };

    };

}

然后在cocos2dx中代码执行流程中输入:

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

    JniMethodInfo minfo;

    JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/cpp/Tools", "showToast", "(Ljava/lang/String;)V");

    JniHelper::getEnv()->CallStaticVoidMethod(minfo.classID, minfo.methodID, JniHelper::getEnv()->NewStringUTF("Hello Java"));

即可实现调用showToast函数。

3、setDesignResolutionSize()不能放在if(!glview){}里面,否则没有效果。

4、cocos2d项目编译apk时,需要对proj.android/jni/Android.mk文件添加.cpp和.h路径,若路径太多时,可以使用下述方法进行添加:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cocos2d-x开发中jni相关记录 的相关文章

随机推荐

  • 最详细的【基数排序】---排序算法,思路清晰动图保姆级讲解,五分钟搞懂!

    基数排序 已同步微信公众号 乐享Coding 想要一起学习的可以加群 共同交流 基本思想 将所有待比较数值统一为同样的数位长度 数位较短的数前面补零 从最低位开始 依次进行一次排序 这样从最低位排序一直到最高位排序完成以后 数列就变成一个有
  • 通用mapper的常用查询,select和selectByPrimaryKey

    通用mapper 的查询总结 1 如果是等值查询 根据其主键查询 则可以用selectByPrimaryKey 如果不是主键 而是根据其他值查询 那么用select T t T为通用mapper对应的类类型 这里传入一个该类的实例 根据改实
  • linux系统盘大小显示64Z,linux磁盘容量变为64Z

    author skate time 2012 06 05 linux磁盘容量变为64Z root localhost df h 文件系统 容量 已用 可用 已用 挂载点 dev sda3 255G 2 6G 240G 2 dev sda1
  • matlab敏感词输出代码,敏感词过滤的简易实现

    介绍 很多时候我们需要对接受的文本进行过滤 剔除一下不当用词 比如一些反动的 侮辱性的 淫秽的用语 一般会有一个敏感词词库 基于这个词库对输入的文本进行过滤 分享一种简易的实现 示例中为了和谐 将不会出现上述违反社会主义核心价值观的词汇 使
  • 免费简单的在线QQ聊天

    今天在写电商网站的时候 用JSP AJAX写聊天功能写的够蛋疼的 突然想到 有谁会在你这个网站上不知道对方上线有空回你没有整天挂着这个网站呢 比起在网站上聊天 倒不如直接在QQ上聊天 所以目标就是实现点击一个链接直接在QQ上于另外一个人链接
  • 分布式缓存(面试使用)

    一 缓存穿透 含义 缓存中取不到数据 直接透过缓存请求db 如果是恶意攻击 会使数据库崩 方案 1 对于自己系统可以根据bloom filter算法计算一个hash值 只对自己系统业务请求 如果是其他请求则过滤 2 空值缓存 对于没有的ke
  • 快速排序c语言

    include
  • IDEA中的Git操作之创建分支与切换分支

    背景 前文 我们已经能够通过IDEA将本地的项目代码提交到GitHub上了 本文主要来讲讲如何在IDEA中创建Git分支 以及怎么切换分支 创建一个分支 master gt New Branch 填写分支名称 Create 创建分支成功后
  • 合理使用DTO(Data Transfer Object)

    文章目录 1 DTO简介 2 到底什么是DTO 3 将DTO用作POJO 4 Java 中使用DTO的例子 5 反例 滥用DTO 6 小结 相关链接 DTO 全称为 Data Transfer Object 我们一般称之为 数据传输对象 1
  • chrony命令的相关练习,适合新手!!!

    chrony命令基本使用 有些系统本身就有这个命令不需要我们再安装 使用rpm qa grep chrony可以查看一下 查看 ntp servers chronyc sources v 查看 ntp servers 状态 chronyc
  • 高赞:为什么别选计算机专业?

    在知乎看到一个这样的问题 为什么别选计算机专业 nbsp 这个话题有 800 万人次浏览 以下是一位匿名用户的高赞回答 内容可能比较主观化 仅代表原作者个人观点 如果有不同意见欢迎留言区交流啊 不明白现在鼓吹计算机是什么意思 985计算机毕
  • [peft]ImportError: cannot import name ‘is_npu_available‘ from ‘accelerate.utils‘

    今天在使用peft库的时候出现了下面的错误 估计是peft刚出来还不太稳定的原因 ImportError cannot import name is npu available from accelerate utils 解决方法 pip
  • maven package 打包test出错导致打包失败

    第二个方法解决了 https blog csdn net u010515155 article details 78458232
  • 记录:基于vue使用ag-grid表格(基本用法)

    首先还是安装ag grid npm install ag grid vue 在main js引入 Vue component ag grid vue AgGridVue import ag grid enterprise styles ag
  • 详解Node.js API系列 Crypto加密模块(2) Hmac

    简介 随着互联网的发展 MD5已经变得越来越不安全了 黑客可以通过彩虹表 查出MD5值所对应的密码 为了解决这个问题 很多网站都开始采用需要密钥加密的Hmac算法 Hmac算法 HMAC是密钥相关的哈希运算消息认证码 Hash based
  • 第四章 STP协议

    目录 环路问题 STP树的生成 STP报文格式 STP的改进 STP配置示例 环路问题 为了提高网络的可靠性 交换网络中通常会使用冗余链路 然而 在冗余链路中会给交换网络带来环路风险 并导致广播风暴以及MAC地址表不稳定等的问题 进而影响到
  • 一文详解编程中的随机数

    一文详解编程中的随机数 随机数的类型 真随机数生成器 TRNG True Random Number Generator 伪随机数生成器 PRNG Pseudo Random Number Genrator 随机数的使用 真随机数 开发中常
  • 机器学习之数据处理过程小知识+参考网址集合

    机器学习之数据处理过程小知识 画图 fig ax plt subplots 的理解 这个fig ax plt subplots 的意思是 建立一个fig对象 建立一个axis对象 不然要用更复杂的方式来建如下 fig plt figure
  • nginx 五种策略

    nginx 五种策略 1 轮询 每个请求按照时间顺序分配到不同的服务器 如果后端服务器down掉 就自动剔除了 2 指定权重 用于性能不均 哪个服务器分配的多些 weight 3 3 ip绑定 每个请求按照ip的hash结果分配 一个访客一
  • cocos2d-x开发中jni相关记录

    使用加载的uijson文件中的按钮时 在按钮的响应函数里面删除掉 this gt removeFromParent ui所在的层时 发生崩溃 解决办法 修改UIWidget cpp文件中releaseUpEvent函数 如图 1 在coco