依旧是惯例

See the Pen Aurora Borealis by 攻伤菊菊长 (@THISISAGOODNAME) on CodePen.

       前天写了篇webidl相关的文章,觉得写得不够清楚,这次写一个完整实例

创建Bar class

       在c++代码中创建Bar类

//
//Bar.h
//
#ifndef CLASS_BAR_H
#define CLASS_BAR_H


class Bar {
public:
    Bar(long val);
    int doSomething();
    int addSum(int a, int b);
};


#endif //CLASS_BAR_H
//
//Bar.cpp
//
#include "Bar.h"

Bar::Bar(long val) {

}

int Bar::doSomething() {
    return 233;
}

int Bar::addSum(int a, int b) {
    return a+b;
}

创建IDL文件

       创建一个IDL文件,文件名任意,我以my_classes.idl为例

interface Bar {
        void Bar(long val);
        long doSomething();
        long addSum(long a, long b);
};

编译idl文件生成胶水文件

       运行tools/webidl_binder.py脚本

python $EMSCRIPTEN/tools/webidl_binder.py my_classes.idl glue

$EMSCRIPTEN指emscripten的根目录

       运行完webidl_binder.py脚本之后,文件夹下会生成glue.cppglue.js两个文件

创建一个文件包含glue.cpp

       创建一个cpp文件,文件名任意,我以my_glue_wrapper.cpp为例

       在该文件中包含glue.cpp项目的头文件,比如在本例中,my_glue_wrapper.cpp的内容应该为

//
//my_glue_wrapper.cpp
//
#include "Bar.h"
#include "glue.cpp"

编译项目

       编译工程,记得添加my_glue_wrapper.cppglue.js

emcc Bar.cpp my_glue_wrapper.cpp --post-js glue.js -o output.js

测试

       创建一个html文件,记得包含output.js

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>webidl test</title>
		<script src="output.js"></script>
	</head>
	<body>
		请打开开发者工具来进行测试
	</body>
</html>

       之后,可以和在向JS对象相同的方法来使用编译的C++对象

在JavaScript中调用编译的C++对象