写作及;使用Java’调用Swift代码;s JNI
由于JVM的JNI,您可以从Java代码执行本机C/C++方法调用但是执行方法调用怎么样?随着Swift变得越来越流行,这是可能的还是可能的(可以在合理的时间范围内实现)写作及;使用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编写应用程序,可以访问
我想访问苹果的原生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你可以叫斯威夫特
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