最近项目两个需求,
1.打开客户端的邮件App并自动填写收件人地址.
2.打开默认浏览器并转到URL.
然后!!IOS和安卓的调用方式明显不同啊,连JAVA都没学过,ECLIPSE也没用过的真是亚历山大。。
不过经历一番波折好歹是弄出来了啊 - -
首先 我们在XCode中建立一个GameOpenMail的C++文件
GameOpenMail.h
class GameOpenMail{
public:
static void openMailApp();
static void openUrl(const char* url) ;
}
先说IOS
首先改文件名 GameOpenMail.cpp -> GameOpenMail.mm
这里要把.cpp后缀改成.mm 不然无法执行OC代码
GameOpenMail.mm
void GameOpenMail::openMailApp(){
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://xxx@163.com"]];
//这就是打开IOS系统默认邮件App的方法 一句话简单直接粗暴
}
void GameOpenMail::OpenUrl(const char* url){
NSURL* nsurl = [[NSURL alloc]initWithString:[NSString stringWithCString:url encoding:NSUTF8StringEncoding]] ;
//先把 const char* 转换成NSURL
[[UIApplication sharedApplication] openURL:nsurl];
//又是简单粗暴!!
}
在这不得不感叹OC真是简单省事啊!!
下面接着Android部分
GameOpenMail.cpp
#include "jni/JniHelper.h"
#include <jni.h>
#include "cocos2d.h"
//这里要先引用JNI 这是cocos2dx调用安卓代码的方法
void GameOpenMail::openMailApp()
{
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t //引用的变量
,"com/game/game/PostMail" //类的路径
,"PostEmail" //方法名
,"(Ljava/lang/String;)V")) //(参数)返回值
{
CCLog("jni function ok");
jstring StringArg1 = t.env->NewStringUTF("xxx@163.com");//将地址转成jstring
t.env->CallStaticVoidMethod(t.classID,t.methodID, StringArg1);//执行函数 StringArg1 作为参数传递
}
else
{
CCLog("jni function error");
}
}
void GameOpenMail::openUrl(const char* url)
{
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t
, "com/game/game/PostMail"
,"OpenUrl"
,"(Ljava/lang/String;)V"))
{
CCLog("jni function ok");
jstring StringArg1 = t.env->NewStringUTF(url);
t.env->CallStaticVoidMethod(t.classID,t.methodID, StringArg1);
}
else
{
CCLog("jni function error");
}
}
这里要解释一下参数和返回值类型
- 参数类型 参数简写
- boolean Z
- byte B
- char C
- short S
- int I
- long J
- float F
- double D
- void V
- Object Ljava/lang/String; 用/分割类的完整路径
- Array [Ljava/lang/String;
如果函数有多个参数,直接把简写并列即可。注意Object与Array型参数简写结尾的分号,示例:
IIII //4个int型参数的函数
ILjava/lang/String;I //整形,string类型,整形组合 (int x, String a, int y)
接下来是JAVA代码
PostMail.java
package com.game.game;
import org.cocos2dx.lib.Cocos2dxActivity;
import android.net.Uri;
import android.content.*;
class PostMail extends Cocos2dxActivity {
public static void PostEmail(String url) {
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL, new String[] { url });//收件人
i.putExtra(Intent.EXTRA_SUBJECT, "Its an is Excellent Game!");//标题
getContext().startActivity(Intent.createChooser(i, "Select application"));//通过startActivity来调用Android App
}
public static void OpenUrl(String url) {
Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
Uri content_url = Uri.parse(url);//这里要注意 url是必须以"http://"开头 不然会报错
i.setData(content_url);
getContext().startActivity(i);
}
}