Développement multiplateforme mobile et Web avec C ++ expliqué

Développement multiplateforme mobile et Web avec C ++ expliqué

Partie 2: Passer des objets d’avant en arrière

Stéphane Konstantaropoulos

Le modèle de données doit être défini dans Djinni, cela créera les définitions C ++ et Java. Nous devrons ensuite créer manuellement les liaisons Javascript.

user = record {
login: string;
id: i32;
avatar_url: string;
gravatar_id: optional;
...
created_at: date;
updated_at: date;
}

repo = record {
id: i32;
...
}

emscripten::class_("User")
.property("login", &User::login)
.property("id", &User::id)
...
.property("updated_at", &User::updated_at);

emscripten::class_("Repo")
.property("id", &Repo::id)
..
.property("pushed_at", &Repo::pushed_at);

emscripten::val toJsDate(std::chrono::system_clock::time_point timePoint) {
return emscripten::val(
(long) (std::chrono::duration_cast(timePoint.time_since_epoch())).count());
}
emscripten::class_("TimePoint")
.function("sec", &toJsDate);

La prochaine chose dont nous avons besoin est d’interfaces pour accéder et manipuler ces modèles de données.

xptuto = interface +c {
static make_instance() : xptuto;
get_users() : list;
get_repos_for_user(u: user) : list;
}
class XptutoImpl : public xptuto::Xptuto {

std::vector get_users() override;

std::vector get_repos_for_user(const xptuto::User & u) override;

};

std::shared_ptr xptuto::Xptuto::make_instance() {
return std::make_shared();
}
emscripten::class_("Xptuto")
.smart_ptr>("Xptuto")
.class_function("make_instance", &Xptuto::make_instance)
.function("get_users", &Xptuto::get_users)
.function("get_repos_for_user", &Xptuto::get_repos_for_user);

Dans Xcode, compiler et exécuter, nous avons ajouté un petit extrait dans ViewController.mm

- (void)viewDidLoad {
[super viewDidLoad];
auto x = Xptuto::make_instance();
for (const auto &user : x->get_users()) {
NSLog(@"Got user with name: %s", user.name.c_str());
}
}
@Override
protected void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Xptuto x = Xptuto.makeInstance();
for (User u : x.getUsers()) {
Log.d("XP", "Got a user with name: " + u.name);
}
}

var Module = {
onRuntimeInitialized: function() {
var x = Module.Xptuto.make_instance();
var users = x.get_users();
for (var i = 0; i < users.size(); i++) {
console.log('Got a user with name: ' + users.get(i).name);
}
}
};