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