gpt4 book ai didi

java - 使用 Swift 在 iOS 和 Android 之间共享核心代码

转载 作者:搜寻专家 更新时间:2023-11-01 07:59:00 26 4
gpt4 key购买 nike

我想要的:使用 Swift 在 Android 和 iOS 之间共享非 UI 代码。

问题:Android 具有 NDK 支持,允许您使用 Java native 接口(interface) (JNI) 运行 C 和 C++ 代码(而非 Objective C)。我是一名 Java 程序员,不太了解编译 C 代码的来龙去脉。为了能够通过 JNI 访问快速方法,我需要执行哪些一般步骤?

最佳答案

您可以使用 RemObjects Silver 代替 JNI。你在那里写的 swift 代码不是用 Apple 的 Swift 工具链编译的,而是他们有自己的编译器工具链,叫做 Elements,所以 Element's Swift 也被称为 Silver 与苹果的swift有些区别。它已经过扩展,因此可以很好地融入 Java 和 .NET 世界。您可以在此处阅读更多相关信息 - Silver Language Extentions .

您可以使用来自 Visual Studio 或他们自己的名为 Fire 的 OS X IDE 的元素。让我用 Fire 来演示一个非常简单的例子。 ( Download Elements )

示例:简单的共享记录器

1. 开火并创建一个新项目。在项目模板中,选择共享项目。 (平台的选择无所谓)

2.File -> New File 下使用 Code File 模板创建一个新的空源文件。我们称它为记录器。 (确保选择的语言是 swift)

3.将该文件的内容替换为:

#if COOPER
import java.util
#elseif ECHOES
import System.Collections.Generic
import System.Linq
import System.Text
#elseif NOUGAT
import Foundation
#elseif !ELEMENTS

#endif


public class Logger {

public class func logIt(stuff: String){
#if NOUGAT
NSLog("\(stuff)")
#elseif ECHOES
Console.WriteLine("\(stuff)")
#elseif COOPER
System.out.println("\(stuff)")
#elseif !ELEMENTS
print("\(stuff)")
#endif
}
}

这是适用于每个平台的记录器抽象的最简单示例。使用预处理器指令,您可以指定将编译到每个特定平台的代码。
NOUGAT 代表 cocoa
ECHOES 代表 .NET
COOPER 代表 Java

您还可以使用 !ELEMENTS 来指示您将有条件地使用其他工具链编译的代码,例如,如果您想要使用 Apple 的 Swift 构建代码。

  1. File -> New Project下创建新的Android类库并将其添加到当前解决方案

  1. 在左侧的解决方案资源管理器中,将您的共享项目(您可以从共享项目的地球图标中拖动)拖到您的 android 类库引用中。然后您应该能够在那里看到您的共享项目。您也可以删除 Android 类库的源文件。

  1. Fire -> 首选项 下,转到第 4 个选项卡并确保您拥有 Fire 发现的 JDK、JRE 和 Android 文件夹。

  2. 构建解决方案。 Android 类库将构建您现在可以在 Android Studio 项目中使用的 .jar 文件。

  3. 导航到您的 Android 类库项目目录,并将 .jar 文件从 obj/Dubug/Android 复制到您的 Android 项目 libs 文件夹中。

  4. 在 Android Studio 中,右键单击 .jar 文件并按添加为库。然后确保您的 build.gradle 在其依赖项中有 compile files('libs/swiftcommons.android.jar')

这就是 Logger 在反编译时的样子。

package swiftcommons.android;

public class Logger {
public static void logIt(String stuff) {
if(stuff == null) {
throw new IllegalArgumentException("stuff");
} else {
System.out.println(String.format("%s", new Object[]{stuff}));
}
}

public Logger() {
}
}

现在您可以从您的代码中调用您的记录器了:

import swiftcommons.android.Logger;
//.....
Logger.logIt("It works..");

另外,作为一个很好的策略,我会建议您编写共享代码库,该代码库将使用 Apple 的快速工具链 (#IF !ELEMENTS) 和 Elements for Android 进行编译。 (#IF COOPER)。 Elements 还为您提供 SwiftBaseLibrary 和名为 Sugar 的实用程序库您可以在使用 Elements 进行编译时使用。

关于java - 使用 Swift 在 iOS 和 Android 之间共享核心代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24073963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com