凯的BLOG

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

·

在Cocos2d项目中与运营平台(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);
	}
}