cocos2d-x开发中jni相关记录

使用加载的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路径,若路径太多时,可以使用下述方法进行添加:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值