有没有办法在haxe中创建一个可以在iOS和Android上本地调用的库?

Gus*_*ado 7 android haxe ios

我想制作一些常用的服务调用,数据模型等,作为我的iOS和Android应用程序中的库使用,我想也许Haxe能够做到这一点,但我找不到任何例子.有人可以说明这是否可行以及如何开始?

Phi*_*ppe 10

这是一个非常重要的话题,而且是可能的.但是,您可能必须公开特定于主机的API,因为Java和Objective-C/C++具有不同的本机类型.

对于iOS,您可以在这里找到答案的开头:如何从Haxe创建iOS-和OSX-库并在本机应用程序中使用它?

对于Android,它很容易按照通常的侦听器接口模式公开API.但是你通常不能在Java中传递函数引用,所以Haxe-java使用类似的模式使用Closure/Function对象来概括,这些对象在Java中很难使用.

编写Java的Haxe代码:

确保将@:nativeGenmeta 添加到所有公开的类中 - Haxe反射将不起作用,但是当从Java使用时它将更清晰.

package com.foo;

@:nativeGen
class MyModel {
    public function new() {
    }
    public function doSomething(listener:SomethingListener) {
        Timer.delay(function() {
            listener.onResult(cpt);
        }, 2000);
    }
}

@:nativeGen
interface SomethingListener {
    function onResult(value:Int):Void;
}
Run Code Online (Sandbox Code Playgroud)

基础知识很简单,但是魔鬼在细节中:要使用/返回Java本机类型,你必须做一些转换工作:

从Haxe生成JAR:

# generates java source under /MyAPI and a corresponding /MyAPI/MyAPI.jar
haxe -cp src -java MyAPI -D no-root com.foo.MyModel
Run Code Online (Sandbox Code Playgroud)

笔记:

  • -main 省略,因为我们不想要静态入口点
  • -D no-root将生成一个本机外观的包,否则包装内的东西haxe.

在Java方面:

您可以导入此JAR并透明地使用它.

从IntelliJ/Android Studio,您可以创建一个模块:项目结构>添加模块>导入JAR/AAR包.

重要的是要注意IntelliJ在项目中复制JAR,因此在重建Haxe项目时必须更新JAR.IntelliJ将立即获取更改.

import com.foo.MyModel;
import com.foo.SomethingListener;

MyModel myModel = new MyModel();
myModel.doSomething(new SomethingListener() {
    @Override
    public void onResult(int value) {
        // Got something from Haxe
    }
});
Run Code Online (Sandbox Code Playgroud)