C++與java混合編寫和C++與OC混合編寫 筆記

1JavaC++混合編寫: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-qualified-class;

[] [] [ type

後兩種是泛用類型,Java自定義類型和數組

舉例:C++函數描述:long f (int n, String s, int[] arr);JNI描述爲:(ILjava/lang/String;[I)J

函數JniHelper::getStaticMethodInfo以及JniHelper::getMethodInfococos2dx\platform\android\jni\JniHelper.cpp文件中有實現。


2OCC++混合編寫:

OC是概念的C語言,目前GCCClang都支持OCC++混合編譯,OC的文件後綴名稱是.mm。能夠在C++.h文件建立類以及方法的聲明,在對應.mm文件實現類和聲明的方法。

例如,在CCDevice.h文件定義了staticconstchargetDeviceName();實現以下:

const char* CCDevice::getDeviceName()
{
    NSString *strName = [[UIDevice currentDevice] name];
    return [strName UTF8String];
}
相關文章
相關標籤/搜索