C++与java混合编写和C++与OC混合编写 笔记

1JavaC++混合编写:

使用JNI(Java本地调用)

实例:cocos2dx/platform/android/jni对应目录cocos2dx/platform/android/java

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 "";
    }
}

返回值是String

JNI的参数返回值格式:“(参数)返回值”

类型如下表:

C++类型

Java类型

描述符

boolbooleanZ
bytebyteB
charcharC
shortshortS
intintI
longlongJ
floatfloatF
doubledoubleD
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];
}


转载于:https://my.oschina.net/u/659405/blog/278881

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值