android和cocos2dx c++工程交互(java和c++通过jni交互)

1.先在android建一个实体类MidiInfo

package org.cocos2dx.data;

/**
 * Created by cai on 2016/3/2.
 */
public class MidiInfo {

    int cable;
    int channel;
    int note;
    int velocity;
    boolean isTouch;

    public int getCable() {
        return cable;
    }

    public void setCable(int cable) {
        this.cable = cable;
    }

    public int getChannel() {
        return channel;
    }

    public void setChannel(int channel) {
        this.channel = channel;
    }

    public int getNote() {
        return note;
    }

    public void setNote(int note) {
        this.note = note;
    }

    public int getVelocity() {
        return velocity;
    }

    public void setVelocity(int velocity) {
        this.velocity = velocity;
    }

    public boolean isTouch() {
        return isTouch;
    }

    public void setTouch(boolean touch) {
        isTouch = touch;
    }
}

然后再cocos2dx工程中的Classes文件夹下建立相对应的类
MidiInfo.h

#ifndef __MIDI_INFO_H__
#define __MIDI_INFO_H__

#include "cocos2d.h"

class MidiInfo
{
public:
    MidiInfo();
    ~MidiInfo();

    CC_SYNTHESIZE(int, m_cable, Cable);
    CC_SYNTHESIZE(int,m_channel,Channel);
    CC_SYNTHESIZE(int,m_node,Note);
    CC_SYNTHESIZE(int,m_velocity,Velocity);
    CC_SYNTHESIZE(bool, m_isTouch,IsTouch);

};

#endif // !__MIDI_INFO_H__

MidiInfo.cpp

#include "MidiInfo.h"



MidiInfo::MidiInfo()
{
}


MidiInfo::~MidiInfo()
{
}

2.cocos2dx调用android方法
在android的jni文件夹中建立test.h

#ifndef TEST_H_
#define TEST_H_

#include "../Classes/MidiInfo.h"

extern "C"
{
    void setMidiWithJava(MidiInfo* midi);
}
#endif

对应的test.cpp

#include "test.h"
#include "cocos2d.h"
#include "platform/android/jni/JniHelper.h"
#include "../../../Classes/HelloWorldScene.h"
#include "../../../Classes/MidiInfo.h"
#include <jni.h>

#define CLASS_NAME "org/cocos2dx/cpp/JniTestHelper"
using namespace cocos2d;
extern "C"
{

    void setMidiWithJava(MidiInfo* midi)
    {

        JniMethodInfo t;
        jobject midi_obj;

        if(JniHelper::getMethodInfo(t,"org/cocos2dx/data/MidiInfo","<init>","()V")){
            jclass midi_cls = t.env->FindClass("org/cocos2dx/data/MidiInfo");
            midi_obj = t.env->NewObject(midi_cls,t.methodID);

            jfieldID cableFieldID = t.env->GetFieldID(midi_cls,"cable","I");
            jfieldID channelFieldID = t.env->GetFieldID(midi_cls, "channel", "I");
            jfieldID noteFieldID = t.env->GetFieldID(midi_cls, "note", "I");
            jfieldID velocityFieldID = t.env->GetFieldID(midi_cls, "velocity", "I");
            jfieldID isTouchFieldID = t.env->GetFieldID(midi_cls, "isTouch", "Z");

            t.env->SetIntField(midi_obj,cableFieldID,midi->getCable());
            t.env->SetIntField(midi_obj, channelFieldID, midi->getChannel());
            t.env->SetIntField(midi_obj, noteFieldID, midi->getNote());
            t.env->SetIntField(midi_obj, velocityFieldID, midi->getVelocity());
            t.env->SetBooleanField(midi_obj, isTouchFieldID, midi->getIsTouch());

            if (JniHelper::getStaticMethodInfo(t,CLASS_NAME,"setMidiWithJava","(Lorg/cocos2dx/data/MidiInfo;)V"))
            {
                t.env->CallStaticVoidMethod(t.classID, t.methodID,midi_obj);
            }
        }

    }

android代码JniTestHelper.java

package org.cocos2dx.cpp;
import org.cocos2dx.data.MidiInfo;
import android.os.Handler;
import android.os.Message;

public class JniTestHelper {
    private static Handler mHandler;
    public static void init(Handler handler) {
        JniTestHelper.mHandler = handler;
    }

    private static void setMidiWithJava(MidiInfo midiInfo){

        Message msg = mHandler.obtainMessage();
        msg.what = AppActivity.PLAY_SOUND;
        msg.obj = midiInfo;
        msg.sendToTarget();
    }

}

cocos2dx中HelloWorldScence.cpp

#include "MidiInfo.h"
#include "../proj.android/jni/hellocpp/test.h"

setMidiWithJava(midi);

3.android向cocos2dx传值
JniTestHelper.java加行代码

public synchronized static native void setMidiInfo(MidiInfo midiInfo);

test.cpp加入

void Java_org_cocos2dx_cpp_JniTestHelper_setMidiInfo(JNIEnv* env,jobject thiz,jobject obj_midi)
    {
        MidiInfo *midiInfo = new MidiInfo();
        jclass midi_cls = env->GetObjectClass(obj_midi); //获得MidiInfo类引用
        if(midi_cls != NULL)
        {
            jfieldID cableFieldID = env->GetFieldID(midi_cls,"cable","I");
            jfieldID channelFieldID = env->GetFieldID(midi_cls,"channel","I");
            jfieldID noteFieldID = env->GetFieldID(midi_cls,"note","I");
            jfieldID velocityFieldID = env->GetFieldID(midi_cls,"velocity","I");
            jfieldID isTouchFieldID = env->GetFieldID(midi_cls,"isTouch","Z");

            jint cable = env->GetIntField(obj_midi, cableFieldID);
            jint channel = env->GetIntField(obj_midi, channelFieldID);
            jint note = env->GetIntField(obj_midi, noteFieldID);
            jint velocity = env->GetIntField(obj_midi,velocityFieldID);
            jboolean isTouch = env->GetBooleanField(obj_midi, isTouchFieldID);

            midiInfo->setCable(cable);
            midiInfo->setChannel(channel);
            midiInfo->setNote(note);
            midiInfo->setVelocity(velocity);
            midiInfo->setIsTouch(isTouch);

            setMidiInfo(midiInfo);
        }

    }

HelloWorldScene.h中加入

void setMidiInfo(MidiInfo* midi);

HelloWorldScence.cpp加入

void HelloWorld::setMidiInfo(MidiInfo* midi)
{
    auto note = midi->getNote();

}

4.android.mk中添加需要编译的cpp

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   hellocpp/test.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp \
                   ../../Classes/MidiInfo.cpp 

5.用cocos studio打包apk

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值