cocos2dx java调用c++
来源:互联网 发布:wince5.0 盘点软件 编辑:程序博客网 时间:2024/06/14 07:06
在做支付接入时,大都采用cocos2d-x 的jnihelper调用java实现接入,但光c++调java是不够的, 如第三方写的支付接口 支付成功了他们有一个onSuccess事件,可是这个方法是写在java端的AppActivity.java里的,但实际给用户加钱是写在cocos2d-x c++工程里的,java怎么通知c++工程支付成功了?发消息显然不可能,sdk没提供这个接口,只好在java端的onSuccess方法里调用c++类函数了,可是网上大都是利用jnihelper调用java教程,很少有java调c++的,只好自己苦苦搜寻答案了
c++工程端,因为我们对c++比较熟悉,就从它开始吧!
1. 定义供java调用的native接口
//这个方法专门给java调用extern "C" //org.cocos2dx.cpp{JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_MyHelper_setMoney(JNIEnv *env, jobject thiz,jint money){int m = (int)money;User::shared()->setMoney(money);}};必须定义extern “C”,那长长的函数名也好理解,Java是固定开头, org_cocos2dx_cpp就是你的包名"org.cocos2dx.cpp"中间以"_"隔开,MyHelper是java文件里哪一个类会调用这个函数,setMonet是供java类调用的函数名 ,后面参数 JNIEnv* env, jobject thiz这两个固定,后面jint money是函数里用到的参数,可以自己加,注意转成jni中java能识别的类型,如int改成jint
函数体里我们调用了类里的setMoney方法,这就解决了怎么调一个类里的方法的难题.
给出提供这个java接口的全代码:
user.h
#ifndef _User_#define _User_#include "cocos2d.h"class HelloWorld;class User{public:User();~User();HelloWorld* _scene;static User *shared(); //定义单例方法static User* s_UserShared;void setMoney(int money); //设置钱数protected:int _money;private:};#endif // !_User_user.cpp
#include "User.h"#include "HelloWorldScene.h"USING_NS_CC;using namespace std;#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include <jni.h>#include "platform/android/jni/JniHelper.h"#include <android/log.h>//这个方法专门给java调用extern "C" //org.cocos2dx.cpp{JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_MyHelper_setMoney(JNIEnv *env, jobject thiz){//int m = (int)money;User::shared()->setMoney(100);}};#endifUser* User::s_UserShared = nullptr;User::User(){_money = 0;_scene = nullptr;}User::~User(){}User* User::shared(){if (s_UserShared == nullptr){s_UserShared = new User();return s_UserShared;}return s_UserShared;}void User::setMoney(int money){_money = money;log("OK! _money = %d", _money);if (_scene!=nullptr){String* str = String::createWithFormat("Coins: %d", _money);_scene->_pLabal->setString(str->getCString());}}那个helloworldscene变量大家请无视,我只是为了想看效果用的,结果失败了,最后打出Log了事,不要误导大家
java端:
声明java调用c++的接口,我定义一个辅助工具类Helper里调用这个接口,建议你也采用这样的写法,显得整洁
/**
* 这里是java调用cocos2d-x的地方
* @param money 钱
*/
public static native void setMoney();
接口其实就是加个native关键字,下面给出完整的MyHelper.java源码:
package org.cocos2dx.cpp;import android.content.Context;import android.os.Handler;import android.os.Message;import android.widget.Toast;public class MyHelper {private static Context s_context; /** * 初始化内容信息 * @param context */ public static void initContext(Context context){ s_context = context; } /** * 这里是java调用cocos2d-x的地方 * @param money 钱 */ public static native void setMoney();}那什么initContext无关紧要,记住这个类在org.cocos2d.cpp包里,
现在是调用部分:
这里是最关键的一步,早先老是失败是因为java端没有打包c++的编译.so。在android.mk里把定义那个接口的User类加进来,使之能打包到工程一起
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp \
../../Classes/User.cpp
java主启动文件appActitvy.java里,在要调用这个接口方法之前要包含c++包库,一定要记住!
static { System.loadLibrary("cocos2dcpp"); }
然后就可以调用了:MyHelper.setMoney(); 这样就不会报找不到此函数的错误了
完整AppActivity.java类源码:
package org.cocos2dx.cpp;
import org.cocos2dx.lib.Cocos2dxActivity;
import android.R.integer;
import android.os.Bundle;
public class AppActivity extends Cocos2dxActivity {
//public static native void setMoney(int money);
static { System.loadLibrary("cocos2dcpp"); }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("log");
MyHelper.setMoney();
}
}
为了大家便于学习,给出完整源码,对比整理下即可用在自己的工程里:
源码下载
- cocos2dx C++调用java
- cocos2dx java调用c++
- cocos2dx JAVA调用C++
- cocos2dx 调用java 代码
- cocos2dx调用android代码,android调用c
- android - cocos2dx调用java函数
- cocos2dx c++调用java思想
- cocos2dx调用Java方法的问题
- cocos2dx通过Jni调用Android的Java
- Cocos2dx调用java的UI元素
- cocos2dx 使用jni实现java调用c++
- cocos2dx C++调用java -- 字符串传递
- cocos2dx java调用c++ -- 字符串传递
- cocos2dx 使用jni实现java调用c++
- Cocos2dx 通过Java代码调用C++
- cocos2dx-3.2调用java(jni)来内嵌网页
- cocos2dx关于在c/c++中调用lua函数
- java调用C语言
- coderforce 551A - GukiZ and Contest
- gurobi安装
- Redis简介和简单应用
- 乐动力 步数上传 核心分析
- 1062. Talent and Virtue
- cocos2dx java调用c++
- CF 466C Number of Ways
- 拼装当前网页的相对路径
- 构建乘积数组(利用辅助空间+剑指offer)
- spring DelegatingFilterProxy 过滤器 的原理及运用
- XMPP 服务器 Openfire 的 Emoji 支持问题(进行部分修改)
- Linux系统内存监控全面讲解:free命令
- Swift继承(Inheritance)
- 这个该从什么写起啊