有没有办法在 haxe 中创建一个可以在 iOS 和 Android 上本地调用的库?
Is there a way to create a library in haxe that can be called natively on iOS and Android?
我想进行一些常见的服务调用、数据模型等,以在我的 iOS 和 Android 应用程序上用作库,我在想也许 Haxe 可以做到这一点但我找不到任何例子。有人可以阐明这是否可行以及如何开始吗?
这是一个非常重要的话题,而且是有可能的。但是,您可能必须公开特定于主机的 APIs,因为 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
meta 添加到所有公开的 类 - 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;
}
基础很简单,但问题在于细节:要 consume/return Java 原生类型,您将需要做一些转换工作:
- 使用
java.Lib
函数消耗 Java 类型:http://api.haxe.org/java/Lib.html
- 使用
java.NativeArray
制作Java个数组:http://api.haxe.org/java/NativeArray.html
从 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
会生成一个native-looking包,否则东西在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
}
});
我想进行一些常见的服务调用、数据模型等,以在我的 iOS 和 Android 应用程序上用作库,我在想也许 Haxe 可以做到这一点但我找不到任何例子。有人可以阐明这是否可行以及如何开始吗?
这是一个非常重要的话题,而且是有可能的。但是,您可能必须公开特定于主机的 APIs,因为 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
meta 添加到所有公开的 类 - 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;
}
基础很简单,但问题在于细节:要 consume/return Java 原生类型,您将需要做一些转换工作:
- 使用
java.Lib
函数消耗 Java 类型:http://api.haxe.org/java/Lib.html - 使用
java.NativeArray
制作Java个数组:http://api.haxe.org/java/NativeArray.html
从 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
会生成一个native-looking包,否则东西在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
}
});