Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
写作及;使用Java’调用Swift代码;s JNI_Java_Objective C_Swift_Java Native Interface - Fatal编程技术网

写作及;使用Java’调用Swift代码;s JNI

写作及;使用Java’调用Swift代码;s JNI,java,objective-c,swift,java-native-interface,Java,Objective C,Swift,Java Native Interface,由于JVM的JNI,您可以从Java代码执行本机C/C++方法调用但是执行方法调用怎么样?随着Swift变得越来越流行,这是可能的还是可能的(可以在合理的时间范围内实现) 我想访问苹果的原生API,它只有在使用Objective-C或Swift编写应用程序时才能访问。由于JVM刚刚被移植到ARMv8(64位),我还可以想象JVM将来会成为iOS应用程序的替代运行时。但是这个可能是未来的。。。现在的情况是:JVM在Mac OS X上运行,人们可以用Swift为Mac OS X编写应用程序,可以访问

由于JVM的JNI,您可以从Java代码执行本机C/C++方法调用但是执行方法调用怎么样?随着Swift变得越来越流行,这是可能的还是可能的(可以在合理的时间范围内实现)


我想访问苹果的原生API,它只有在使用Objective-C或Swift编写应用程序时才能访问。由于JVM刚刚被移植到ARMv8(64位),我还可以想象JVM将来会成为iOS应用程序的替代运行时。但是这个可能是未来的。。。现在的情况是:JVM在Mac OS X上运行,人们可以用Swift为Mac OS X编写应用程序,可以访问Java应用程序无法访问的一些API。

好吧,大约5年半后,事实证明,这不是未来。。。iOS上没有JVM

但您肯定可以做到这一点,即从Java调用Swift API。也就是说,这相当麻烦,因为您必须绕道C/C++

交易如下:

  • 如您所知,您可以使用JNI调用C代码
  • 从C你可以叫斯威夫特
以下内容在很大程度上依赖于

代码 您的Java代码位于
helloworld/SwiftHelloWorld.Java

package helloworld;

public class SwiftHelloWorld {

    static {
        System.loadLibrary("SwiftHelloWorld");
    }

    public static native void printHelloWorldImpl();

    public static void main(final String[] args) {
        printHelloWorldImpl();
    }

}
现在编写本机C代码(文件
helloworld\u SwiftHelloWorld.C
):

最后,我们的Swift代码位于SwiftCode中。Swift:

import Foundation

// force the function to have a name callable by the c code
@_silgen_name("swiftHelloWorld")
public func swiftHelloWorld(number: Int) -> Int {
    print("Hello world from Swift: \(number)")
    return 69
}
建筑 要构建所有这些,我们首先必须将Swift代码编译为动态库:

swiftc SwiftCode.swift -emit-library -o libSwiftCode.dylib -Xlinker -install_name -Xlinker libSwiftCode.dylib
我们使用
-Xlinker
指令来确保动态库的位置是相对的

在创建C动态库之前,我们首先必须生成Java头文件:

javac -h helloworld/SwiftHelloWorld.java
现在我们有了Java头文件和Swift动态库,我们可以编译C动态库,它链接到Swift动态库:

gcc -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin/" -o libSwiftHelloWorld.dylib -dynamiclib helloworld_SwiftHelloWorld.c libSwiftCode.dylib
现在一切都准备好了,我们必须确保两个DYLIB都在同一个目录中,并且Java可以找到该目录,也就是说,您可能需要设置
-Djava.library.path=

斯威夫特从Java呼叫

我敢肯定,在那里的人会对此做些什么…可能是重复的
javac -h helloworld/SwiftHelloWorld.java
gcc -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin/" -o libSwiftHelloWorld.dylib -dynamiclib helloworld_SwiftHelloWorld.c libSwiftCode.dylib