大约5年半后,结果证明它并不是未来...iOS上没有JVM。
但是你绝对可以做到,也就是说,可以从Java调用Swift API。 话虽如此,因为我所知道的是,你必须通过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();
}
}
helloworld_SwiftHelloWorld.c
):#include <jni.h>
#include <stdio.h>
#include "helloworld_SwiftHelloWorld.h"
#include "helloworld_SwiftHelloWorld_swift.h"
JNIEXPORT void JNICALL Java_helloworld_SwiftHelloWorld_printHelloWorldImpl
(JNIEnv *env, jclass clazz) {
int result = swiftHelloWorld(42);
printf("%s%i%s", "Hello World from JNI! ", result, "\n");
}
这里使用一个名为 helloworld_SwiftHelloWorld_swift.h
的头文件来引用我们尚未编写的 Swift 代码:
int swiftHelloWorld(int);
最后,我们的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
指令来确保 dylib 的位置是相对的。
在创建 C dylib 之前,我们首先要生成 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
-Djava.library.path=<dir of your dylibs>
。javac -h . helloworld/SwiftHelloWorld.java
资源:https://dev59.com/Z2gu5IYBdhLWcg3wdGwb - Anton Petrov