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