cocos2d-x由Jni实现Java与C++打电话给对方。
cocos2d-x与开发商提供一个类JniHelper,提供java与c++之间的互jni解。
笔者所开发的“史上最坑爹的游戏”项目中使用到了JNI。为此专门定义了一个类JniUtil.
头文件JniUtil.h中须要引入例如以下两个.h文件:
2 |
#include "platform/android/jni/JniHelper.h" |
通过C++调用Java
声明一个函数。专门用于处理从C++调用Java的方法,全部调用Java的地方都走这个函数。
这样能够降低jni代码。通过Json来传递详细的调用指令。在java那边通过switch来进行区分,然后再通过java去调用详细的方法。
1 |
static void callJni(const char * data); |
在JniUtil.cpp文件里例如以下实现:
01 |
void JniUtil::callJni(const char *data){ |
05 |
const char * jniClass = "com/xxxx/xxxx/xxxxxxxx"; |
06 |
bool isHave = JniHelper::getStaticMethodInfo(minfo,jniClass,"callJni","(Ljava/lang/String;)V"); |
08 |
CCLog("jni->%s/callJni:此函数不存在", jniClass); |
10 |
CCLog("jni->%s/callJni:此函数存在", jniClass); |
11 |
jstring jdata = minfo.env->NewStringUTF(data); |
13 |
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,jdata); |
15 |
CCLog("jni-java函数运行完成"); |
Java的实现:
1 |
public static void callJni(final String data) { |
2 |
mHandler.postDelayed(new Runnable() { |
通过Java代码调用C++
2 |
private static native void xxxxxx(int value); |
在JniUtil.cpp中作例如以下实现:
4 |
void Java_com_xxxx_xxxx_xxxx_xxxx(JNIEnv* env, jobject thiz, jint a) |