上次写的蓝牙对战游戏先把c++ 调用的代码也贴上来
//打开客户端 ,连接服务器,搜索蓝牙设备
//服务端搜索到蓝牙向c++发送数据
//连接成功之后就可以通信传递数据用于游戏的的通信了
//客户端和服务端通信的代码都一样的
其实上次的就是核心代码,c++ 调用就是用jni通信
流程为 服务端打开蓝牙等待联机
客户端打开蓝牙,搜索蓝牙,选择指定服务端蓝牙,联机成功后通信
//打开服务端
JniMethodInfo info;
jobject jobj;
if(JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/AppActivity","getInstance","()Ljava/lang/Object;"))
{
jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID);
}
<pre name="code" class="html">if(JniHelper::getMethodInfo(info,"org/cocos2dx/cpp/AppActivity","openBlueToot","(I)Ljava/lang/String;"))
{
jstring jstr = (jstring)info.env->CallObjectMethod(jobj,info.methodID,1);
std::string text = JniHelper::jstring2string(jstr);
if (text != "0")
{
//Bluetooth is opened
<span style="white-space:pre"> </span>//打开服务器
if(JniHelper::getMethodInfo(info,"org/cocos2dx/cpp/AppActivity","buildServerConnect","()V"));
{
info.env->CallVoidMethod(jobj,info.methodID);
}
}
}else
{
//Failed to open Bluetooth;
}
//打开客户端 ,连接服务器,搜索蓝牙设备
<pre name="code" class="html">JniMethodInfo info;
jobject jobj;
if(JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/AppActivity","getInstance","()Ljava/lang/Object;"))
{
jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID);
}
if(JniHelper::getMethodInfo(info,"org/cocos2dx/cpp/AppActivity","openBlueToot","(I)Ljava/lang/String;"))
{
jstring jstr = (jstring)info.env->CallObjectMethod(jobj,info.methodID,2);
std::string text = JniHelper::jstring2string(jstr);
if (text != "0")
{
if(JniHelper::getMethodInfo(info,"org/cocos2dx/cpp/AppActivity","findBuleToots","()V"))
{
info.env->CallVoidMethod(jobj,info.methodID);
}
}
}else
{
//open blue failed
}
//服务端搜索到蓝牙向c++发送数据
<pre name="code" class="html">#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
extern "C"{
void Java_org_cocos2dx_cpp_AppActivity_get(JNIEnv* env, jobject thiz){}
void Java_org_cocos2dx_cpp_AppActivity_set(JNIEnv* env, jobject thiz,jint ji){i = ji+1; }
void Java_org_cocos2dx_cpp_AppActivity_StringFromJni(JNIEnv* env, jobject thiz,jstring userList)
{
int i;
jclass cls_arraylist = env->GetObjectClass(userList);
jmethodID arraylist_get = env->GetMethodID(cls_arraylist,"get","(I)Ljava/lang/Object;");
jmethodID arraylist_size = env->GetMethodID(cls_arraylist,"size","()I");
jint len = env->CallIntMethod(userList,arraylist_size);
for(i=0;i<len;i++){
jobject obj_user = env->CallObjectMethod(userList,arraylist_get,i);
jclass cls_user = env->GetObjectClass(obj_user);
jmethodID user_getName = env->GetMethodID(cls_user,"getName","()Ljava/lang/String;");
jmethodID user_getaddress = env->GetMethodID(cls_user,"getAddress","()Ljava/lang/String;");
jstring name = (jstring)env->CallObjectMethod(obj_user,user_getName);
jstring address = (jstring)env->CallObjectMethod(obj_user,user_getaddress);
jboolean b = true;
const char *nameStr = env->GetStringUTFChars(name,&b);
const char *addressStr = env->GetStringUTFChars(address,&b);
log("********************Name:%s; ",nameStr);
log("********************addres:%s; ",addressStr);
}
}
//传递数据
void Java_org_cocos2dx_cpp_AppActivity_SendTo(JNIEnv* env, jobject thiz,jstring msg)
{
const char *pkgName = env->GetStringUTFChars(msg, NULL);
log("***************************************::Sendto ::%s",pkgName);
env->ReleaseStringUTFChars(msg, pkgName);
}
}
//连接蓝牙设备
<pre name="code" class="html">JniMethodInfo info;
jobject jobj;
if(JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/AppActivity","getInstance","()Ljava/lang/Object;"))
{
jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID);
if(JniHelper::getMethodInfo(info,"org/cocos2dx/cpp/AppActivity","chooseBlueDevice","(Ljava/lang/String;)V"));
{
jobject para = info.env->NewStringUTF(address);
info.env->CallVoidMethod(jobj,info.methodID,para);
}
}
//连接成功之后就可以通信传递数据用于游戏的的通信了
//java 向c++<span style="font-family: Arial, Helvetica, sans-serif;">通信</span>
<pre name="code" class="html">extern "C"{
void Java_org_cocos2dx_cpp_AppActivity_SendMsgForServer(JNIEnv* env, jobject thiz,jstring msg)
{
const char *pkgName = env->GetStringUTFChars(msg, NULL);
log("***************************************::SendMsgForServer ::%s",pkgName);
<span style="white-space:pre"> </span>
std::vector<std::string> vv;
<span style="white-space:pre"> </span>//分割字符串
HelloWorld::getInstance()->split(pkgName,"_",vv);
if(vv.at(0).c_str() == std::string("ClientThread"))
{
return;
}else if(vv.at(0).c_str() == std::string("Connect"))
{
//连接成功
}
env->ReleaseStringUTFChars(msg, pkgName);
}
}
//c++ 向java通信
void ServerGame::sendToMsg(const char* str)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfo info;
jobject jobj;
if(JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/AppActivity","getInstance","()Ljava/lang/Object;"))
{
jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID);
}
if(JniHelper::getMethodInfo(info,"org/cocos2dx/cpp/AppActivity","sendMessageHandle","(Ljava/lang/String;)V"));
{
jobject para = info.env->NewStringUTF(str);
info.env->CallVoidMethod(jobj,info.methodID,para);
}
#endif
}
//客户端和服务端通信的代码都一样的