cocos2dx 與android函數的相互調用及使用jni

hello大家好 ,之前一陣子一直在忙項目,沒怎麼發過博文,挺想看看cocos2dx與安卓是如何交互的,所以就學習了一下(因爲我是小菜嘛 想多學點東西 嘻嘻!!!)做了這麼一個小test,雖然不多代碼但小菜弄了許久,發上來給大家分享下

如果有什麼錯誤或建議歡迎大家爲我指出來啊 小菜感激不盡。。。

其實一開始是在想如何在cocos2dx中加入廣告及第三方sdk,出於這個原因而學習了這個,好啦,開始正題啦!!!

1,首先用cocos2dx建立一個安卓項目,我的項目名稱爲Host,包名爲org.cocos2dx.game,在安卓項目裏面新建兩個類一個爲DialogMessage,只是用於作爲變量的存放數據而已,再一個類爲JniTestHelper,用於與cocos2dx及c++交互的類。

兩個類代碼如下:

package org.cocos2dx.game;

/**
author:weihao 
email :[email protected]
date  :2013-10-4
 **/

public class DialogMessage {
	
	public String title;
	public String msg;
}
package org.cocos2dx.game;

import android.os.Handler;
import android.os.Message;

/**
author:weihao 
email :[email protected]
date  :2013-10-4
 **/

public class JniTestHelper {
	
	private static Handler mHandler;
	
	public static void init(Handler handler)
	{
		JniTestHelper.mHandler = handler;
	}
	//java調用c++函數,c++實現
    public static native void setPackageName(String packageName);
    //java調用c++函數,c++實現
    public static native void exitApp();
    
    private static void showTipDialog(final String title, final String text)
    {
    	Message msg = mHandler.obtainMessage();
    	msg.what = Host.SHOW_DIALOG;
    	DialogMessage dm = new DialogMessage();
    	dm.title = title;
    	dm.msg = text;
    	msg.obj = dm;
    	msg.sendToTarget();
    }
    
}


然後在cocos2dx項目中添加函數
JniTest.h(頭文件就行了,在裏面有實現方法),

接下來是以下實現

JniTest.h

#ifndef JNI_TEST_H
#define JNI_TEST_H

#include "cocos2d.h"

using namespace cocos2d;
//java傳來的函數c++實現
void setPackageName(const char *packageName)
{
	CCLog("packageName: %s", packageName);	
}
//java傳來的函數c++實現
void exitApp()
{
	CCDirector::sharedDirector()->end();
}
#endif


再在生成的HelloWorldScene.cpp中修改

引入頭文件

#include "HelloWorldScene.h"

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "../proj.android/jni/hellocpp/test.h"
#endif

USING_NS_CC;
在menuCloseCallback(CCObject* pSender)實現c++調用java函數
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
	showTipDialog("Goto", "Weihao,really go?");
#endif


}
而showTipDialog在test.h,test.cpp裏面實現的 就在頭文件哪裏導入的那個一樣 吧test新建在cocos2dx生成的android項目的/proj.android/jni/hellocpp這個路徑下
在test的實現如下

test.h

#ifndef TEST_H
#define TEST_H

extern "C"
{
void showTipDialog(const char *title, const char *msg);
}
#endif

test.cpp

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

#define CLASS_NAME "org/cocos2dx/game/JniTestHelper"

using namespace cocos2d;

extern "C"
{
void showTipDialog(const char *title, const char *msg)
{
	JniMethodInfo t;
	if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "showTipDialog", "(Ljava/lang/String;Ljava/lang/String;)V"))
	{
		jstring jTitle = t.env->NewStringUTF(title);
		jstring jMsg = t.env->NewStringUTF(msg);
		t.env->CallStaticVoidMethod(t.classID, t.methodID, jTitle, jMsg);
		t.env->DeleteLocalRef(jTitle);
		t.env->DeleteLocalRef(jMsg);
	}
}
//這裏是java回調回來的包名,類名,函數名
void Java_org_cocos2dx_game_JniTestHelper_setPackageName(JNIEnv *env, jobject thiz, jstring packageName)
{
	const char *pkgName = env->GetStringUTFChars(packageName, NULL);
	setPackageName(pkgName);
	env->ReleaseStringUTFChars(packageName, pkgName);
}

void Java_org_cocos2dx_game_JniTestHelper_exitApp(JNIEnv *env, jobject thiz)
{
	exitApp();
}

}

在生成的繼承public class Host extends Cocos2dxActivity類中我們需要添加多一個實例化函數,Handler是用於 負責接收,並按計劃發送和處理消息

private Handler mHandler = new Handler()
    {         //這裏獲取消息以及處理響應在這裏實現
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what)
			{
			case SHOW_DIALOG:
				DialogMessage dm = (DialogMessage)msg.obj;
				new AlertDialog.Builder(Host.this)
				.setTitle(dm.title)
				.setMessage(dm.msg).setNegativeButton("stay", new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
						
					}
				})
				.setPositiveButton("over", 
						new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
					   //這些都是調用回cocos2dx來做出動作	
						JniTestHelper.exitApp();
					}
				})
				.create().show();
				break;
			}
		}
    };


這樣就大體完成了,不過還有最後一步喔,配置android.mk文件

我的配置如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := game_shared

LOCAL_MODULE_FILENAME := libgame

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   hellocpp/test.cpp \
				   ../../Classes/AppDelegate.cpp \
				   ../../Classes/JniTest.h \
				   ../../Classes/HelloWorldScene.cpp 
                   
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes                   

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static game_logic_static cocosdenshion_static cocos_extension_static 
            
include $(BUILD_SHARED_LIBRARY)

$(call import-module,CocosDenshion/android) 
$(call import-module,cocos2dx) 
$(call import-module,extensions)
我是經過cywin生成.so文件後,以及eclipse的生成後apk就成功看到效果了,其實也可以將test合併在HelloWorldScene中的(那樣比較方便),我自己還沒試過,大家可以試試
出行效果大概就是如下






發佈了53 篇原創文章 · 獲贊 4 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章