我的星空我的路吧 关注:2贴子:245
  • 1回复贴,共1

【添加分享】

只看楼主收藏回复

【cocos2d-x 之 添加Android分享】
说在前面:
要弄个cocos2d-x在安卓平台上的分享功能,网上找了下,资料很少啊,好不容易找到个例子。
原帖地址:http://www.cnblogs.com/wendao/archive/2012/02/09/adr_cpp_invoke_java_send.html
但是照着代码搬上去,程序一直死,并不是原作者说的偶尔死。不过还是原帖还是很有参考价值。
原代码稍加改进,就成了如下代码.
一、 Android端代码
public static void Share() {
new Thread(new Runnable() {
public void run() {
Intent intent = new Intent("android.intent.action.SEND");
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_SUBJECT, "我的分享");
intent.putExtra(Intent.EXTRA_TEXT, "拍手庆祝吧!!!");
intent.putExtra(
Intent.EXTRA_STREAM,
Uri.parse("file:////data/data/" + acty.getApplicationInfo().packageName + "/share.png"));
System.out.println("/data/data/" + acty.getApplicationInfo().packageName + "/share.png");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
acty.startActivity(Intent.createChooser(intent, "分享"));
}
}).start();
}
说明:
对比原代码,就会发现这里外面没有用类包裹起来。而且并没有声明Activity acty。看到这里肯定有人问了,那这个函数放哪里呢?这个acty 又从哪里来呢? 别急,下面就告诉你。
原贴中有这样一句声明: public static Activity acty;然后下面就直接调用acty.startActivity()函数,这样没初始化的对象直接使用怎么会不报错呢?!!!而且就算把acty实例化一个新的Activity,但是它自己都未被启动,又怎么利用它来启动新的Activity用以分享呢!!!
所以,接下来就是关键的步骤了:
Step 1:
把这个函数放到主Activity里面(你一定知道是哪个吧?因为用cocos2d-x 创建 Android 项目时就只有一个Activity)。
Step 2:
然后在类里面声明变量:static Activity acty;
Step 3:
在onCreate()的最后一句给它赋值:acty = this;
这样在用到它时就不会报java.lang.NullPointerException错误了。
二、cocos2d-x 里需要实现的代码
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "android/log.h"
#include "platform/android/jni/JniHelper.h"
extern "C"{
void Share()
{
bool hasMethod;
JniMethodInfo jni_methodInfo;
hasMethod = JniHelper::getStaticMethodInfo(jni_methodInfo, "com/jni/test/jnitest", "Share", "()V");
if(hasMethod){
CCLog("function Share() was found");
if(jni_methodInfo.methodID){
jni_methodInfo.env->CallStaticVoidMethod(jni_methodInfo.classID, jni_methodInfo.methodID);
CCLog("function Share() was called");
}
}else{
CCLog("function Share() was not found");
}
}
}
#endif
说明:
这个跟原帖基本上一样的,没什么改动。只需要把代码放在cocos2d项目文件下面就行,不管放在哪里都行,但要遵循c++的调用规则。这个就不多讲。想必学过编程的大家都知道的。
接下来是调用代码:
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
Share();
#endif
说明:
写在需要调用的地方就行。
PS:有什么不懂的地方可以给我留言。
或者有什么不足的地方也希望大家指出相互探讨。


IP属地:浙江1楼2014-12-16 18:36回复
    地址:http://blog.sina.com.cn/s/blog_82ca0a7701013w07.htm


    IP属地:浙江2楼2014-12-16 18:36
    回复