1. 程式人生 > >Cocos2d-x利用jni呼叫java層程式碼

Cocos2d-x利用jni呼叫java層程式碼

jni的意思是java本地呼叫,通過jni可以實現java層程式碼和其他語言寫得程式碼進行互動。在Cocos2d-x中,如果想要在C++層呼叫java層的程式碼,就是通過jni技術。通過呼叫java層的程式碼,我們就可以在Android平臺下實現一些引擎沒有提供給我們的功能,或者做一些其他的功能。比如加個廣告,加個分享,呼叫Android原生的對話方塊等等吧。Cocos2d-x比較人性化的是為我們封裝了jni呼叫的一些介面,這個類就是JniHelper,我們只需要使用這個類提供給我們的介面就可以完成呼叫java層程式碼的功能。先說一下這個類的位置,因為自己在找的時候有點犯二,所以特意說明一下。在3.0和3.1以上的引擎版本中,這個類的位置分別如下。

1407826419891482.png

1407826436116506.png

3.1以後引擎把原來cocos目錄下的包含各個功能的資料夾都放到了cocos目錄下,我個人認為這樣的放法還是比較好的。就是引擎老改目錄,希望以後不要放來放去了。最主要的當然是看看怎麼使用JniHelper這個類了。

首先使用之前要包含標頭檔案,寫法如下,記住要加上條件編譯,這個東西是Android平臺下才用到。

1 2 3 4 5 6 #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "platform/android/jni/JniHelper.h"
#include <jni.h> #endif

接著通過一小段程式碼來說明一下這個類的用法。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //    typedef struct JniMethodInfo_ //    { //        JNIEnv *    env;
//        jclass      classID; //        jmethodID   methodID; //    } JniMethodInfo; JniMethodInfo info; //getStaticMethodInfo判斷java定義的靜態函式是否存在,返回bool bool ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func1","()V"); if(ret) { log("call void func1() succeed"); //傳入類ID和方法ID,小心方法名寫錯,第一個字母是大寫 info.env->CallStaticVoidMethod(info.classID,info.methodID); } #endif

大家書寫程式碼的時候同樣需要將程式碼使用條件編譯寫到裡面,JniMethodInfo是一個結構體,這個結構體的定義就是程式碼中註釋掉的地方,然後使用JniHelper呼叫了靜態函式getStaticMethodInfo,從它的名字就知道這個函式的作用了,就是獲得java層中靜態函式的資訊,這個資訊儲存在什麼地方呢,當然是JniMethodInfo中了,我們要獲取哪個類的哪個函式呢,第二個引數和第三個引數就是告訴JniHelper我們要獲取的是哪個函式的資訊了,第二個引數是類檔案的包名路徑,我在org/cocos2dx/cpp這個路徑下新建了一個類,叫做TestJni。其實前面的路徑就是一個包名,這裡使用的時候用/代替.。org的路徑當然就是我新建的這個工程的Android平臺目錄了。一會我要將這個專案打包然後測試一下,在eclipse下看看輸出。第三個引數當然就是方法名字了,第四個引數是需要注意的一個,有人把它叫做簽名,其實就是你要呼叫的java層函式的返回值和引數的型別說明。它把呼叫函式的引數寫到前面的括號中,返回值跟在括號的後邊,和我們平時書寫函式的時候正好相反了。那那個V是什麼東西呢,這個大寫字母就是對應的一個型別,如果是void型別,那麼就用一個V來代替,如果是一個int型別,那麼就用一個I代替,是不是很簡單,那其他的型別呢,如圖所示。

1407826564603194.png

1407826569982096.png

放了兩張表,用得時候查就好了,關於這個引數其他的細節問題待會討論。整個函式的返回值是一個bool型別,什麼意思不用說了吧。當這個函式的資訊存在的時候我們就進入到了if中了,然後我使用了info結構體的第一個變數來呼叫了函式CallStaticVoidMethod,這個函式可真是需要說一說。

首先它的呼叫者就是儲存函式資訊的結構體JniMethodInfo的第一個成員變數env,這貨是什麼東西不用管,用就好了。

然後這個函式的第一個字母是大寫,這一點要小心,Call後邊如果跟Static代表的就是我要呼叫的是一個靜態的函式,如果沒有那就不是靜態的,不是靜態的函式,我們使用JniHelper獲取資訊的時候用得就是getMethodInfo這個函式。然後Void代表的是函式的返回值,來看我們的例子,我呼叫的函式func1是一個無參無返回值的函式,這個看什麼地方,當然java程式碼我接著會向你展示,但是你可以直接看getStaticMethodInfo這個函式的第四個引數啊。這裡的這個void代表的是函式的返回值型別,所以如果呼叫的是返回值為int的java函式,那就是CallStaticIntMethod了。裡邊的引數就是結構體info的第二個和第三個成員變量了,代表的是類ID和函式ID。這樣的話基本的用法就說清楚了,接著就是TestJni中得程式碼了,我把要呼叫到得函式都寫了出來。

相關推薦

Cocos2d-x利用jni呼叫java程式碼

jni的意思是java本地呼叫,通過jni可以實現java層程式碼和其他語言寫得程式碼進行互動。在Cocos2d-x中,如果想要在C++層呼叫java層的程式碼,就是通過jni技術。通過呼叫java層的程式碼,我們就可以在Android平臺下實現一些引擎沒有提供給我們

cocos2d-x 使用JNIJava調C++

最近專案中涉及到Android的移植,要用到java呼叫c++,方法其實也很簡單。 假設java這邊我需要呼叫C++那邊的函式void PaySuccess(int type); 1、在java這邊申明 1

Java利用JNI呼叫c++程式碼簡易例子演示

點選開啟連結 (提取碼:8676) 一、首先簡單交代一下兩個問題: 1.什麼是JNI                - - -     JNI的全名為Java Native Inter

(JNI)c程式碼利用反射呼叫java方法

反射一般分3個步驟: 1.載入calss(位元組碼),獲取class的物件。 2.獲取對應的方法或屬性。 3.修改屬性,或執行方法。 首先回顧一下java中的反射:  寫一個類JK: public

Java利用JNI呼叫FFMpeg對h264碼流進行解碼

前期配置工作: 使用JNI呼叫: java端: package com.recon.action; public class Decode { public native String loadfile(String s); //

jni呼叫java方法遇到的bug

今天試了各種方法,想在jni c++的其他執行緒呼叫java層的程式碼,不管是java的靜態方法還是例項的非靜態方法都不行。只要app執行是一執行到呼叫的地方,就奔潰。就只能在native函式的當前執行緒呼叫java方法。然後用c程式碼卻可以。這也太奇怪了。不過我專案用的是

JNI 呼叫java裡的基本型別和物件

主要是介紹jni呼叫基本型別和物件,包含例項物件和靜態物件 先上mylog.h檔案 #include<android/log.h> #ifndef TEST_JNI_LOG_H #define TEST_JNI_LOG_H #define TAG "myj

JNI實現回撥| JNI呼叫JAVA函式|引數和返回值的格式

程式碼下載:http://dl.dbank.com/c0c0xs3b24 一、JNI實現回撥 通過JNI在Native層呼叫Java層的方法,來實現Native層向JAVA層傳遞訊息。 JNICallback.java publicclass JNICallback e

Cocos2d-x Lua引擎製作的遊戲程式碼加密

在Mac OS中的終端鍵入:cocos luacompile -h,可以獲得這個命令的幫助: usage: cocos luacompile [-h] [-v] [-s SRC_DIR_ARR] [-d DST_DIR] [-e]         &nbs

cocos2d-x 利用CCLabelTTF製作文字描邊與陰影效果的實現方法

感謝點評與關注,歡迎轉載與分享。勤奮努力,持之以恆! 方法一: cocos2d-x 已經為我們封裝好了,方法就在類CCLabelTTF裡面。 /** enable or disable shadow for the label */ void enableS

cocos2d-x客戶端與Java伺服器的通訊(一)

(⊙o⊙)…貌似自己已經有一段時間沒有寫部落格了,其實主要原因還是覺得自己水平有限,加上上班實在是太忙,實在抽不出時間來寫部落格。言歸正傳,大家都知道,在網路遊戲開發中, 網路通訊一直是個比較大的難題,一個伺服器可能要同時處理幾千上萬甚至上百萬的使用者資料,當然,僅僅是通訊

JNI呼叫Java方法

《Pro Android C++ with the NDK》學習筆記 獲取方法ID 呼叫方法 JNI呼叫Java靜態方法案例 與域一樣,Java中有兩類方法:例項方法和靜態方法。JNI提

JNI 最簡單的Java呼叫C/C 程式碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java 通過JNI呼叫C或者CPP程式碼

網上搜羅到一個JNI的例子,不錯。用cygwin的環境搞了下,在原作上添加了點註釋。 如下: 最近在公司裡做了一個手機的專案,需要JAVA程式在傳送簡訊的時候和第三方的簡訊伺服器連線。簡訊介面是用C++寫的。琢磨了三天,大致搞懂了JNI的主體部分。先將心得整理,希望各位朋友少

JNI學習(一)(c和java物件互相呼叫)

c層呼叫java物件 package com.example.bean; /** * * java物件 * @author telenewbie * */ public class JNI_cCalljava_test { publi

Cocos2d-x簡單遊戲程式碼實現|第三部分:引導

#ifndef __ShootPlane__InstroLayer__ #define __ShootPlane__InstroLayer__ #include <iostream> #include "commonHeader.h"

chromium JNI呼叫java呼叫c++程式碼

這篇blog我們主要來介紹下chromium下content目錄下的jni呼叫. JNI呼叫主要分兩塊: 1.     Java調cpp(cc) 2.     Cc(cpp)調Java 現在,我們這裡介紹Java調cc. 要實現java呼叫cc檔案,要準備三個檔案:cc檔案

JAVA利用反射呼叫不同方法,減少重複程式碼

今天在寫大作業的時候,遇到如下問題:整個方法裡只有資料獲取時的get方法不同,如何通過傳遞進來的不同的例項引數來使用不同的方法,而避免大段的程式碼copy,做到程式碼複用。於是今天粗略地瞭解了反射機制

JNI之C/C++呼叫Java

呼叫靜態方法 jmethodID cb = env->GetStaticMethodID(thiz, "creat

Cocos2d-x學習筆記(四) 布景的加入移除

dcl from position 顏色 顯示地圖 idt col 分享 學習 布景層類也就是CCLayer類,每一個遊戲場景中都能夠有非常多層,每一層負責各自的任務。顯示地圖、顯示人物等。同一時候層還是一個容器,能夠放入文本、圖片和菜單。構成遊戲中一個個UI。這次