多种语言互相调用,对比总结COC

1.1互相调用语言分为两类:

编译之后直接生成可执行文件的语言。如CC++swiftobject-c

编译成中间语言或者干脆就是脚本语言,这样的需要借助虚拟机运行。如javajsphpkotlin

1.2调动要解决两个问题:

语言语句的互相调用,如何编译过去的问题

内存访问问题,变量之间如何访问及如何赋值

1.3编译类语言之间的调用:

编译语言之间的调用,一般借助.h文件即可(因为编译语言在发明的时候,就要处理好他们和C类语言的关系),调用方借助.h文件中的声明,完成编译。实现方按照.h文件中的接口实现即可。

1.3.1swift调用oc

swift调用oc,靠bridge_header.h文件,在工程中设定中指定这个文件即可。

1.3.2oc调用C++

oc调用C++,把oc的文件改成.mm文件,然后就可以任意混用oc的代码和C++的代码。因为clang编译器遇到.mm文件,就知道这是混写的文件,支持importinclude。

oc的函数调用写法,迥异于C++。

oc的成员变量访问写法,同于C++。

编译器知道如何分辨和处理他们

1.3.3C++调用oc

C++调用oc,C++文件.cpp,只能只用C++的编译规则,不能写oc代码。

为此需要借助.h文件,.h文件的声明,让C++的cpp文件能编译通过。

.h文件的实现oc的.m,按照oc的语法编译,最后到.o文件,再连接到一起。

Test1.cpp

intliResult=testFunc1();

CPP2C-bridge-Header.h

inttestFunc1();

TestOC.mm

inttestFunc1()

{

turn1;

}

1.4编译语言之间的内存访问问题:

因为.mm文件,支持使用C++,所以C++的类型可以直接使用。

重点要处理NSStringconstchar*NSDatabyte*等类型之间的互相转化问题

1.5编译类语言,调用虚拟机类语言

这就有点难了,不支持混编,不能直接调用,不支持直接内存访问,数据类型不通用。

编译类语言的安全性,是靠编译器检查来保证的,在编译器就决定了。

虚拟机类语言的安全性一部分是语言保证,一部分是虚拟机保证(java静态类型语言,js动态类型语言)。

编译类语言只能同虚拟机打交道,完成虚拟机定义类型和自身类型的转换。

凡事虚拟机类型的语言,都可以通过反射完成调用。

a初始化调用环境,解决好多线程问题

b使用字符串调用脚本类语言,界定好类方法参数这些,具体的调用又虚拟机完成

c处理好参数和返回值,这涉及到数据类型之间的映射,特别是数组和自定义类型如何映射的问题。

虚拟机为了安全性,不会把内存开放的,只会把各种处理都封装成接口供调用。

1.5.1ocjava调用js

oc代用js最简单,直接使用eval("脚本代码")就可以。

Application::getInstance()-getScheduler()-performFunctionInCocosThad([=](){

se::ScriptEngine::getInstance()-evalString(script.c_str());

});

C++调用java就要复杂的多,需要处理jni的各种情况,复杂的原因就是复杂带来强大。

java调用js,通过native方法实现:

String


转载请注明:http://www.aierlanlan.com/cyrz/3120.html