Cocos2d-x通过Jni实现C++与Java相互调用

在cocos2dx项目中与运营平台(java sdk)对接时使用了JNI。

 

通过C++调用Java

在JniUtil.h文件中如下实现:

#ifndef  _JNIUTIL_H_
#define  _JNIUTIL_H_

class JniUtil
{
public:
    void static login(const char* zoneId, const char* zoneName);
};

#endif // _JNIUTIL_H_

在JniUtil.cpp文件中如下实现:

#include "JniUtil.h"

#include <jni.h>
#include "platform/android/jni/JniHelper.h"

void JniUtil::login(const char* zoneId, const char* zoneName)
{
    JniMethodInfo minfo;
    if (JniHelper::getStaticMethodInfo(minfo,
        "com/platform/test/JniUtil",
        "login",
        "(Ljava/lang/String;Ljava/lang/String;)V"))
    {
        jstring jzoneId = minfo.env->NewStringUTF(zoneId);
        jstring jzoneName = minfo.env->NewStringUTF(zoneName);
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, jzoneId, jzoneName);

        minfo.env->DeleteLocalRef(minfo.classID);
        minfo.env->DeleteLocalRef(jzoneId);
        minfo.env->DeleteLocalRef(jzoneName);
    }
}

Java的实现:

package com.platform.test;

public class JniUtil {    
    private static void login(String zoneId, String zoneName) {
        // do
    }
}

 

通过Java调用C++

在java的JniUtil类中定义一个方法,用于提供给java调用C++:

package com.platform.test;

public class JniUtil {
    public static native void onLogin(String result);
}

在JniUtil.cpp文件中如下实现:

方法名与java类中的包名+方法名,以下划线连接

extern "C"
{
    void Java_com_platform_test_JniUtil_onLogin(JNIEnv*  env, jobject thiz, jint jresult)
    {
    const char* result = env->GetStringUTFChars(jresult, NULL);
    CCLOG("onLogin : %s", result);
    env->ReleaseStringUTFChars(jresult, result);
    }
}

 

一看就明白怎么调用,不过多解释

posted @ 2015-02-09 23:59  iak  阅读(349)  评论(0编辑  收藏  举报