Is there a way to create a library in haxe that can be called natively on iOS and Android?

时间:2016-02-12 21:52:56

标签: android ios haxe

I want to make some common service calls, data models, etc, to use as a library on my iOS and Android apps, I was thinking that maybe Haxe is capable of doing this but I can't find any example. Can someone shed some light on whether this is possible and how to begin?

1 个答案:

答案 0 :(得分:10)

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

对于iOS ,您可以在此处找到答案的开头:How to create iOS- & OSX- library from Haxe and use it in native application?

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

为Java编写Haxe代码:

确保将@:nativeGen元添加到所有公开的类中 - 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;
}

基础知识很简单,但是魔鬼在细节中:要使用/返回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

注意:

  • -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
    }
});