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) |