您的位置:首页 > 移动开发 > Cocos引擎

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

2015-02-09 23:59 866 查看
在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);
}
}


一看就明白怎么调用,不过多解释
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: