日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > Cocos2d-x3.3RC0通過JNI實現(xiàn)Java與C++互調(diào)

Cocos2d-x3.3RC0通過JNI實現(xiàn)Java與C++互調(diào)

來源:程序員人生   發(fā)布時間:2014-11-06 09:44:16 閱讀次數(shù):2803次

1、JNI

JNI(Java Native Interface):Java的本地調(diào)用。本文通過JNI在Cocos2d-x3.3RC0中完成Java與C++的互調(diào)。具體實現(xiàn)以下兩個功
能:(1)通過Android sdk的API得到利用程序的包名,并傳遞給C++層函數(shù)。(2)通過C++函數(shù)調(diào)用Android的Java層函數(shù),顯示1個對話框。點擊按鈕退出程序。
詳細(xì)知識見:http://blog.csdn.net/yuxikuo_1/article/details/39577257。其中最重要的是JNIEnv,這是1個C結(jié)構(gòu)體。封裝了許多
經(jīng)常使用函數(shù):具體以下:
struct _JNIEnv {     /* do not rename this; it does not seem to be entirely opaque */     const struct JNINativeInterface* functions;   #if defined(__cplusplus)       jint GetVersion()     { return functions->GetVersion(this); }       jclass DefineClass(const char *name, jobject loader, const jbyte* buf,         jsize bufLen)     { return functions->DefineClass(this, name, loader, buf, bufLen); }       jclass FindClass(const char* name)     { return functions->FindClass(this, name); } // 這里省略其他函數(shù)...   }
Cocos2d-x對jni的操作進(jìn)行了封裝,提供JniHelper類解決Java與C++的通訊。
下面介紹兩個經(jīng)常使用的函數(shù):

1、getStaticMethodInfo:

        用來判斷java類中靜態(tài)函數(shù)是不是存在,初始化結(jié)構(gòu)體JniMethodInfo。該結(jié)構(gòu)體封裝了JNIEnv*和java.lang.Class、函數(shù)ID。這樣可使用JNIEnv*調(diào)用CallStaticXXXMethod(jclass clazz,jmethodID methodID,...)和CallXXXMethod(jobject obj,jmethodID methodID,...)等經(jīng)常使用函數(shù),其中XXX代表函數(shù)返回值類型,如void、int等。以下代碼:參數(shù)1:JniMethodInfo,參數(shù)2:類的絕對路徑,該路徑為:proj.android/src/下的目錄,例如引擎模板工程下的路徑為:src/org/cocos2dx/cpp/XXX。XXX為cpp下的java文件。記住路徑中不用加.java后綴,由于路徑使用的是類名。參數(shù)3:函數(shù)名,參數(shù)4:函數(shù)簽名,具體規(guī)則見3類型簽名

JniMethodInfo info; bool ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/AppActivity","getObj","()Ljava/lang/Object;"); jobject jobj; if(ret) { log("call void getObj() succeed"); jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID); } bool re = JniHelper::getMethodInfo(info,"org/cocos2dx/cpp/AppActivity","func1","()V"); if(re) { log("call func1 succeed"); info.env->CallVoidMethod(jobj,info.methodID); }

2、getMethodInfo:用于調(diào)用Java類的非靜態(tài)函數(shù)


#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) JniMethodInfo info; //判斷org/cocos2dx/cpp/AppActivity.java中是不是存在getObj靜態(tài)函數(shù) bool ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/AppActivity","getObj","()Ljava/lang/Object;"); jobject jobj;//用于寄存返回的對象 if(ret) { log("call void getObj() succeed"); jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID);//調(diào)用getObj函數(shù),返回1個對象 } //判斷org/cocos2dx/cpp/AppActivity.java中是不是存在func1非靜態(tài)函數(shù) bool re = JniHelper::getMethodInfo(info,"org/cocos2dx/cpp/AppActivity","func1","()V"); if(re) { log("call func1 succeed"); info.env->CallVoidMethod(jobj,info.methodID);//通過返回的對象調(diào)用非靜態(tài)函數(shù) } #endif

3、類型簽名

類型簽名 Java類型
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L full-qualified-class; 完全限定的類
[ type type[ ]
(arg-types) ret-type 方法類型

        如java方法:long f(int n,String s,int[] arr); 類型簽名為:(ILjava/lang/String;[I)J。注意L后的分號,[是半開的,要與類型簽名完全1致

2、具體步驟

1、創(chuàng)建Cocos2d-x3.3RC0工程

這個不做過量介紹,既然研究到Jni了,相比都不是太菜鳥了。

2、ADT與XCode分別導(dǎo)入工程

3、Xcode的Class目錄下添加JniTest類


JniTest.h代碼以下:JniTest.cpp暫時沒有代碼
#ifndef __JniDemo__JniTest__ #define __JniDemo__JniTest__ #include "cocos2d.h" USING_NS_CC; //定義兩個C++方法,在Jni的test.h中被Java方法調(diào)用。 //該方法被Java_org_cocos2dx_cpp_JniTestHelper_setPackageName調(diào)用 //定義org/cocos2dx/cpp/JniTestHelper類中的setPackageName方法 void setPackageName(const char* packageName) { log("packageName = %s",packageName); } //該方法被Java_org_cocos2dx_cpp_JniTestHelper_exitApp調(diào)用 //定義org/cocos2dx/cpp/JniTestHelper類中得exitApp函數(shù) void exitApp() { Director::getInstance()->end(); } #endif /* defined(__JniDemo__JniTest__) */

然后在HelloWorldScene.cpp中包括以下頭文件,并在menuCloseCallback中添加以下代碼:
//頭文件包括,判斷平臺 #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "../proj.android/jni/hellocpp/test.h"//1定是相對路徑 #endif //調(diào)用C++調(diào)用Java層代碼 void HelloWorld::menuCloseCallback(Ref* pSender) { #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) showTipDialog("exit","Exit,Really Go?"); #endif #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif }

4、Jni層代碼

打開ADT工程目錄下的jni/hellocpp/列表,在hellocpp下添加c++類,test.cpp和test.h。代碼以下:1定包括extern "C"
</pre><p class="p1"><pre name="code" class="cpp">#ifndef TEST_H_ #define TEST_H_ extern "C" { //C++調(diào)Java的函數(shù)接口,該方法在HelloWorldScene中menuCallback函數(shù)中使用。 void showTipDialog(const char* title,const char* msg); } #endif

test.cpp代碼以下:

#include "test.h" #include "cocos2d.h" #include "platform/android/jni/JniHelper.h" #include "../../../Classes/JniTest.h" #include <jni.h> #define CLASS_NAME "org/cocos2dx/cpp/JniTestHelper" using namespace cocos2d; extern "C" { //C++調(diào)Java的函數(shù),在HelloWorldScene中的menuCallback函數(shù)中調(diào)用。 void showTipDialog(const char* title,const char* msg) { JniMethodInfo t; //判斷CLASS_NAME的類中是不是存在showTipDialog函數(shù),如果存在,則調(diào)用。 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調(diào)C++函數(shù),Java函數(shù)來自org/cocos2dx/cpp/JniTestHelper的java類。同時該函數(shù)為JniTestHelper的java類中setPackageName原生方法的定義 void Java_org_cocos2dx_cpp_JniTestHelper_setPackageName(JNIEnv* env,jobject thiz,jstring packageName) { const char* pkgName = env->GetStringUTFChars(packageName,NULL); setPackageName(pkgName);//此處調(diào)用的是Class目錄下JniTest類中的函數(shù) env->ReleaseStringUTFChars(packageName,pkgName); } //同上,該函數(shù)定義了JniTestHelper的java類中的exitApp原生函數(shù)。 void Java_org_cocos2dx_cpp_JniTestHelper_exitApp(JNIEnv* env,jobject thiz) { exitApp();//此處調(diào)用的時Class目錄中JniTest類中的函數(shù)。 } }

5、Java層函數(shù)

在ADT工程目錄src/org.cocos2dx.cpp的目錄下添加java類,JniTestHelper.java
1)JniTestHelper.java代碼以下:
#include "test.h" #include "cocos2d.h" #include "platform/android/jni/JniHelper.h" #include "../../../Classes/JniTest.h" #include <jni.h> #define CLASS_NAME "org/cocos2dx/cpp/JniTestHelper" using namespace cocos2d; extern "C" { //C++調(diào)Java的函數(shù),在HelloWorldScene中的menuCallback函數(shù)中調(diào)用。 void showTipDialog(const char* title,const char* msg) { JniMethodInfo t; //判斷CLASS_NAME的類中是不是存在showTipDialog函數(shù),如果存在,則調(diào)用。 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調(diào)C++函數(shù),Java函數(shù)來自org/cocos2dx/cpp/JniTestHelper的java類。同時該函數(shù)為JniTestHelper的java類中setPackageName原生方法的定義 void Java_org_cocos2dx_cpp_JniTestHelper_setPackageName(JNIEnv* env,jobject thiz,jstring packageName) { const char* pkgName = env->GetStringUTFChars(packageName,NULL); setPackageName(pkgName);//此處調(diào)用的是Class目錄下JniTest類中的函數(shù) env->ReleaseStringUTFChars(packageName,pkgName); } //同上,該函數(shù)定義了JniTestHelper的java類中的exitApp原生函數(shù)。 void Java_org_cocos2dx_cpp_JniTestHelper_exitApp(JNIEnv* env,jobject thiz) { exitApp();//此處調(diào)用的時Class目錄中JniTest類中的函數(shù)。 } }

2)AppActivity.java代碼

package org.cocos2dx.cpp; import org.cocos2dx.lib.Cocos2dxActivity; import org.cocos2dx.lib.Cocos2dxGLSurfaceView; import org.cocos2dx.lib.Cocos2dxHandler.DialogMessage; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.os.Message; public class AppActivity extends Cocos2dxActivity{ public static final int SHOW_DIALOG = 0x0001; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); JniTestHelper.init(mHandler); //調(diào)用JniTestHelper的setPackageName函數(shù),setPackageName函數(shù)在test.cpp中定義,終究調(diào)用C++層的setPackageName方法 JniTestHelper.setPackageName(this.getPackageName()); } public Cocos2dxGLSurfaceView onCreateView(){ Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); glSurfaceView.setEGLConfigChooser(5,6,5,0,16,8); return glSurfaceView; } static { System.loadLibrary("cocos2dcpp"); } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case SHOW_DIALOG: DialogMessage dm = (DialogMessage)msg.obj; new AlertDialog.Builder(AppActivity.this) .setTitle(dm.titile) .setMessage(dm.message).setNegativeButton("cancle", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { // TODO Auto-generated method stub arg0.dismiss(); } }) .setPositiveButton("Ok",new DialogInterface.OnClickListener(){ public void onClick(DialogInterface arg0, int arg1) { arg0.dismiss(); JniTestHelper.exitApp();//調(diào)用JniTestHelper的exitApp函數(shù),exitApp函數(shù)在test.cpp中定義,終究調(diào)用C++層的exitApp方法 } }) .create().show(); break; } } }; }



好了,代碼和注釋基本就結(jié)束了,還需要該的是Android.mk文件。代碼以下:
LOCAL_SRC_FILES := hellocpp/main.cpp hellocpp/test.cpp //將新建的test.cpp類加入mk文件 ../../Classes/AppDelegate.cpp ../../Classes/HelloWorldScene.cpp
之前介紹過萬能mk文件生成方法,詳見http://blog.csdn.net/yuxikuo_1/article/details/39552431。為了減少出問題的概率,建議改高AndroidManifest中的SDK版本,不改無所謂也。

6、工程總目錄


3、編譯運行

如出現(xiàn)問題可參考
1)http://blog.csdn.net/yuxikuo_1/article/details/39654499
2)http://blog.csdn.net/yuxikuo_1/article/details/39552639
3)http://blog.csdn.net/yuxikuo_1/article/details/39671733
注:環(huán)境Mac  XCode6  ADT22.2.1  Cocos2d-x3.3RC0  紅米Note。


4、源碼

說了這么多,沒有源碼那不是坑爹么。源碼連接:http://pan.baidu.com/s/1jGn80QE
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 香蕉视频在线免费看 | 91精品国产色综合久久 | 国产一区中文字幕 | 日本韩国欧美 | 日韩欧美在线看 | 久久久国产精品 | 亚洲免费高清 | 欧美日韩激情在线 | 国产精品入口麻豆九色 | jzzujzz少亚洲成熟少妇 | 亚洲精品成人无限看 | 日本在线精品 | 欧美激情亚洲激情 | 狼人综合网 | 亚洲自拍小视频 | 成年人视频网站 | 丝袜 亚洲 另类 欧美 综合 | 亚洲精品在线观看网站 | 99在线视频免费观看 | 欧美一级黄色片免费观看 | 不卡的av电影在线 | 视频在线一区二区三区 | 天天干天天射综合网 | www久久精品| 一区二区精品视频 | 在线观看日韩精品 | 欧美性猛交xxxx黑人交 | 日本黄色电影网站 | 欧美日韩黄色大片 | 久久久久国产精品免费免费搜索 | 欧美日韩一区精品 | 在线观看av资源 | 91精品免费 | 综合欧美一区二区三区 | 91久久精品一区二区 | 日本中文字幕在线播放 | 精品美女久久久久久免费 | 在线国产福利 | 亚洲国产免费 | 亚洲五月六月 | 久久精品国产一区二区 |