C++与java混合编写和C++与OC混合编写 笔记
C++与java混合编写和C++与OC混合编写 笔记
悠米海 发表于4年前
C++与java混合编写和C++与OC混合编写 笔记
  • 发表于 4年前
  • 阅读 773
  • 收藏 4
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 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类型

描述符

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


共有 人打赏支持
粉丝 13
博文 91
码字总数 36984
×
悠米海
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: