1、Java與C++混合編寫:java
使用JNI(Java本地調用)android
實例:cocos2dx/platform/android/jni對應目錄cocos2dx/platform/android/javaapi
const char* getConstStrRetuen(const char* funcName) { JniMethodInfo t; std::string ret; if (JniHelper::getStaticMethodInfo(t, "org/cocos2dx/lib/Cocos2dxHelper", funcName, "()Ljava/lang/String;")) { jstring retFromJava = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID); const char* str = t.env->GetStringUTFChars(retFromJava, 0); ret = str; t.env->ReleaseStringUTFChars(retFromJava, str); t.env->DeleteLocalRef(t.classID); } return ret.c_str(); } const char* getDEVICENAME() { return getConstStrRetuen("getDeviceName"); }
如上,調用JniHelper::getStaticMethodInfo(JniMethodInfo &,java代碼文件,方法名,參數返回值定義)數組
在org/cocos2dx/lib/Cocos2dxHelper.java文件存在一個方法函數
public static String getDeviceName() { try{ String manufacturer = Build.MANUFACTURER; String model = Build.MODEL; if (model.startsWith(manufacturer)) { return capitalize(model); } else { return capitalize(manufacturer) + "" + model; } } catch(Exception e) { return ""; } }
返回值是Stringui
JNI的參數返回值格式:「(參數)返回值」spa
類型以下表:code
C++類型orm |
Java類型get |
描述符 |
bool | boolean | Z |
byte | byte | B |
char | char | C |
short | short | S |
int | int | I |
long | long | J |
float | float | F |
double | double | D |
string | Ljava/lang/String; |
L fully-q ualified-class; |
[] | [] | [ type |
後兩種是泛用類型,Java自定義類型和數組
舉例:C++函數描述:long f (int n, String s, int[] arr);JNI描述爲:(ILjava/lang/String;[I)J
函數JniHelper::getStaticMethodInfo以及JniHelper::getMethodInfo在cocos2dx\platform\android\jni\JniHelper.cpp文件中有實現。
2、OC與C++混合編寫:
OC是概念的C語言,目前GCC和Clang都支持OC與C++混合編譯,OC的文件後綴名稱是.mm。能夠在C++的.h文件建立類以及方法的聲明,在對應.mm文件實現類和聲明的方法。
例如,在CCDevice.h文件定義了staticconstchar* getDeviceName();實現以下:
const char* CCDevice::getDeviceName() { NSString *strName = [[UIDevice currentDevice] name]; return [strName UTF8String]; }