1、Java与C++混合编写:
使用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::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];
}