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

Java 使用Swift在iOS和Android之间共享核心代码,java,android,swift,Java,Android,Swift,我想要什么: 使用Swift在Android和iOS之间共享非UI代码 问题: Android有NDK支持,允许使用java本地接口(JNI)运行C++和C++代码(不是目标C)。我是一名Java程序员,不太了解编译C代码的细节。为了能够通过JNI访问swift方法,我需要经历哪些一般步骤?您需要将swift库导出为。因此,您必须编写一个包装器(JNI)来在Java层和库之间进行交互。对于包装器部分,请安装RemObjects的人员宣布的。这是与Elements编译器套件兼容的Swift前端。E

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

问题:
Android有NDK支持,允许使用java本地接口(JNI)运行C++和C++代码(不是目标C)。我是一名Java程序员,不太了解编译C代码的细节。为了能够通过JNI访问swift方法,我需要经历哪些一般步骤?

您需要将swift库导出为。因此,您必须编写一个包装器(JNI)来在Java层和库之间进行交互。对于包装器部分,请安装RemObjects的人员宣布的

。这是与Elements编译器套件兼容的Swift前端。Elements为JVM、Android、.Net、iOS和OSX平台生成程序。您可以使用此工具集以C#、Oxygen(ObjectPascal的版本)和现在的Swift编写应用程序


我一直在使用Silver的预发布版本,看到Swift代码在我的Android设备上运行很有趣。期待着从系统中去掉一些皱纹,并在Android上发布我的第一个Swift应用程序。请注意,您正在编写本机UI工具包。。。除了开源RemObjects Sugar库中的一些基本数据结构(如数组和字典)之外,没有多平台代码可供使用

您可以使用RemObjects Silver来代替JNI。您在那里编写的swift代码不是用苹果的swift工具链编译的,而是他们自己的编译器工具链,称为Elements,因此元素的swift(也称为Silver)与苹果的swift有些不同。它已经被扩展,以便很好地融入Java和.NET世界。你可以在这里阅读更多关于它的信息-

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

示例:简单共享记录器 1.开火并创建一个新项目。在项目模板中,选择共享项目。(平台的选择无关紧要)

2.文件->新建文件下使用代码文件模板创建一个新的空源文件。让我们称之为记录器。(确保所选语言为
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
代表可可
回声
代表.NET
COOPER
代表Java

您也可以使用
!元素
,指示您将使用其他工具链有条件编译的代码,例如,如果您想使用Apple的Swift构建代码

  • 文件->新建项目下创建新的Android类库并将其添加到当前解决方案中
  • 在左侧的解决方案资源管理器中,将共享项目(可以从共享项目的全局图标拖动)拖动到android类库引用中。然后,您应该能够在那里看到您的共享项目。您还可以删除Android类库拥有的源文件
  • Fire->Preferences下,转到第四个选项卡,确保您拥有Fire发现的JDK、JRE和Android文件夹

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

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

  • 在Android studio中,右键单击.jar文件并按添加为库。然后确保build.gradle的依赖项中有
    编译文件('libs/swiftcomons.android.jar')

  • 这就是日志程序在反编译时的外观

    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..");
    

    另外,作为一个好策略,我建议您编写共享代码库,使用苹果的swift工具链(
    #IF!ELEMENTS
    )和Android元素进行编译。(
    #IF COOPER
    )。元素还为您提供了SwiftBaseLibrary和调用的实用程序库,您可以在使用元素编译时使用这些库。

    因此我需要编译swift代码,我是否可以直接从JNI访问swift代码?或者我需要使用C/C++和NDK制作一个包装器。由于NDK没有objective C/Swift运行时,我需要担心内存问题,还是所有这些功能仍然可以正常工作?在做了一些研究之后,有一个更好的问题:objective C/Swift运行时是否也编译到了.so文件中?