Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ extension JNISwift2JavaGenerator {
private func printGlobalSwiftThunkSources(_ printer: inout CodePrinter) throws {
printHeader(&printer)

printJNIOnLoad(&printer)

for decl in analysis.importedGlobalFuncs {
printSwiftFunctionThunk(&printer, decl)
printer.println()
Expand All @@ -130,6 +132,18 @@ extension JNISwift2JavaGenerator {
}
}

private func printJNIOnLoad(_ printer: inout CodePrinter) {
printer.print(
"""
@_cdecl("JNI_OnLoad")
func JNI_OnLoad(javaVM: JavaVMPointer, reserved: UnsafeMutableRawPointer) -> jint {
SwiftJavaRuntimeSupport._JNI_OnLoad(javaVM, reserved)
return JNI_VERSION_1_6
}
"""
)
}

private func printNominalTypeThunks(_ printer: inout CodePrinter, _ type: ImportedNominalType) throws {
printHeader(&printer)

Expand Down Expand Up @@ -222,7 +236,7 @@ extension JNISwift2JavaGenerator {
let methodSignature = MethodSignature(resultType: .void, parameterTypes: enumCase.parameterConversions.map(\.native.javaType))
let methods = #"[.init(name: "<init>", signature: "\#(methodSignature.mangledName)")]"#

return #"_JNIMethodIDCache(environment: try! JavaVirtualMachine.shared().environment(), className: "\#(nativeParametersClassName)", methods: \#(methods))"#
return #"_JNIMethodIDCache(className: "\#(nativeParametersClassName)", methods: \#(methods))"#
}

private func printEnumGetAsCaseThunk(
Expand Down
229 changes: 229 additions & 0 deletions Sources/SwiftJava/generated/JavaThread.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
// Auto-generated by Java-to-Swift wrapper generator.
import CSwiftJavaJNI

@JavaClass("java.lang.Thread")
open class JavaThread: JavaObject {
@JavaMethod
@_nonoverride public convenience init(_ arg0: String, environment: JNIEnvironment? = nil)

@JavaMethod
@_nonoverride public convenience init(environment: JNIEnvironment? = nil)

@JavaMethod
open func getName() -> String

@JavaMethod
open func run()

@JavaMethod
open func interrupt()

@JavaMethod
open override func toString() -> String

@JavaMethod
open override func clone() throws -> JavaObject!

@JavaMethod
open func join(_ arg0: Int64, _ arg1: Int32) throws

@JavaMethod
open func join() throws

@JavaMethod
open func join(_ arg0: Int64) throws

@JavaMethod
open func setContextClassLoader(_ arg0: JavaClassLoader?)

@JavaMethod
open func setPriority(_ arg0: Int32)

@JavaMethod
open func setDaemon(_ arg0: Bool)

@JavaMethod
open func start()

@JavaMethod
open func getPriority() -> Int32

@JavaMethod
open func isDaemon() -> Bool

@JavaMethod
open func getContextClassLoader() -> JavaClassLoader!

@JavaMethod
open func isVirtual() -> Bool

@JavaMethod
open func isAlive() -> Bool

@JavaMethod
open func threadId() -> Int64

@JavaMethod
open func getUncaughtExceptionHandler() -> JavaThread.UncaughtExceptionHandler!

@JavaMethod
open func stop()

@JavaMethod
open func isInterrupted() -> Bool

@JavaMethod
open func setName(_ arg0: String)

@JavaMethod
open func checkAccess()

@JavaMethod
open func getId() -> Int64

@JavaMethod
open func setUncaughtExceptionHandler(_ arg0: JavaThread.UncaughtExceptionHandler?)
}
extension JavaThread {
@JavaInterface("java.lang.Thread$Builder")
public struct Builder {
@JavaMethod
public func name(_ arg0: String) -> JavaThread.Builder!

@JavaMethod
public func name(_ arg0: String, _ arg1: Int64) -> JavaThread.Builder!

@JavaMethod
public func uncaughtExceptionHandler(_ arg0: JavaThread.UncaughtExceptionHandler?) -> JavaThread.Builder!

@JavaMethod
public func inheritInheritableThreadLocals(_ arg0: Bool) -> JavaThread.Builder!
}
}
extension JavaThread.Builder {
@JavaInterface("java.lang.Thread$Builder$OfPlatform", extends: JavaThread.Builder.self)
public struct OfPlatform {
@JavaMethod
public func name(_ arg0: String, _ arg1: Int64) -> JavaThread.Builder!

@JavaMethod
public func name(_ arg0: String, _ arg1: Int64) -> JavaThread.Builder.OfPlatform!

@JavaMethod
public func name(_ arg0: String) -> JavaThread.Builder!

@JavaMethod
public func name(_ arg0: String) -> JavaThread.Builder.OfPlatform!

@JavaMethod
public func priority(_ arg0: Int32) -> JavaThread.Builder.OfPlatform!

@JavaMethod
public func daemon() -> JavaThread.Builder.OfPlatform!

@JavaMethod
public func daemon(_ arg0: Bool) -> JavaThread.Builder.OfPlatform!

@JavaMethod
public func uncaughtExceptionHandler(_ arg0: JavaThread.UncaughtExceptionHandler?) -> JavaThread.Builder.OfPlatform!

@JavaMethod
public func uncaughtExceptionHandler(_ arg0: JavaThread.UncaughtExceptionHandler?) -> JavaThread.Builder!

@JavaMethod
public func stackSize(_ arg0: Int64) -> JavaThread.Builder.OfPlatform!

@JavaMethod
public func inheritInheritableThreadLocals(_ arg0: Bool) -> JavaThread.Builder.OfPlatform!

@JavaMethod
public func inheritInheritableThreadLocals(_ arg0: Bool) -> JavaThread.Builder!
}
}
extension JavaThread.Builder {
@JavaInterface("java.lang.Thread$Builder$OfVirtual", extends: JavaThread.Builder.self)
public struct OfVirtual {
@JavaMethod
public func name(_ arg0: String, _ arg1: Int64) -> JavaThread.Builder!

@JavaMethod
public func name(_ arg0: String, _ arg1: Int64) -> JavaThread.Builder.OfVirtual!

@JavaMethod
public func name(_ arg0: String) -> JavaThread.Builder!

@JavaMethod
public func name(_ arg0: String) -> JavaThread.Builder.OfVirtual!

@JavaMethod
public func uncaughtExceptionHandler(_ arg0: JavaThread.UncaughtExceptionHandler?) -> JavaThread.Builder!

@JavaMethod
public func uncaughtExceptionHandler(_ arg0: JavaThread.UncaughtExceptionHandler?) -> JavaThread.Builder.OfVirtual!

@JavaMethod
public func inheritInheritableThreadLocals(_ arg0: Bool) -> JavaThread.Builder.OfVirtual!

@JavaMethod
public func inheritInheritableThreadLocals(_ arg0: Bool) -> JavaThread.Builder!
}
}
extension JavaThread {
@JavaInterface("java.lang.Thread$UncaughtExceptionHandler")
public struct UncaughtExceptionHandler {
@JavaMethod
public func uncaughtException(_ arg0: JavaThread?, _ arg1: Throwable?)
}
}
extension JavaClass<JavaThread> {
@JavaStaticField(isFinal: true)
public var MIN_PRIORITY: Int32

@JavaStaticField(isFinal: true)
public var NORM_PRIORITY: Int32

@JavaStaticField(isFinal: true)
public var MAX_PRIORITY: Int32

@JavaStaticMethod
public func currentThread() -> JavaThread!

@JavaStaticMethod
public func onSpinWait()

@JavaStaticMethod
public func holdsLock(_ arg0: JavaObject?) -> Bool

@JavaStaticMethod
public func interrupted() -> Bool

@JavaStaticMethod
public func activeCount() -> Int32

@JavaStaticMethod
public func enumerate(_ arg0: [JavaThread?]) -> Int32

@JavaStaticMethod
public func yield()

@JavaStaticMethod
public func sleep(_ arg0: Int64) throws

@JavaStaticMethod
public func sleep(_ arg0: Int64, _ arg1: Int32) throws

@JavaStaticMethod
public func ofPlatform() -> JavaThread.Builder.OfPlatform!

@JavaStaticMethod
public func ofVirtual() -> JavaThread.Builder.OfVirtual!

@JavaStaticMethod
public func dumpStack()

@JavaStaticMethod
public func setDefaultUncaughtExceptionHandler(_ arg0: JavaThread.UncaughtExceptionHandler?)

@JavaStaticMethod
public func getDefaultUncaughtExceptionHandler() -> JavaThread.UncaughtExceptionHandler!
}
1 change: 1 addition & 0 deletions Sources/SwiftJava/swift-java.config
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"java.lang.Void" : "JavaVoid",
"java.lang.CharSequence": "CharSequence",
"java.lang.Appendable": "Appendable",
"java.lang.Thread": "JavaThread",
"java.util.Optional": "JavaOptional",
"java.util.OptionalDouble": "JavaOptionalDouble",
"java.util.OptionalInt": "JavaOptionalInt",
Expand Down
31 changes: 31 additions & 0 deletions Sources/SwiftJavaRuntimeSupport/JNI.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2025 Apple Inc. and the Swift.org project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Swift.org project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

import SwiftJava
import CSwiftJavaJNI

final class JNI {
static var shared: JNI!

let applicationClassLoader: JavaClassLoader

init(fromVM javaVM: JavaVirtualMachine) {
self.applicationClassLoader = try! JavaClass<JavaThread>(environment: javaVM.environment()).currentThread().getContextClassLoader()
}
}

// Called by generated code, and not automatically by Java.
public func _JNI_OnLoad(_ javaVM: JavaVMPointer, _ reserved: UnsafeMutableRawPointer) {
JNI.shared = JNI(fromVM: JavaVirtualMachine(adoptingJVM: javaVM))
}
3 changes: 0 additions & 3 deletions Sources/SwiftJavaRuntimeSupport/JNIMethodIDCaches.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ extension _JNIMethodIDCache {
)

private static let cache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "java/util/concurrent/CompletableFuture",
methods: [completeMethod, completeExceptionallyMethod]
)
Expand Down Expand Up @@ -59,7 +58,6 @@ extension _JNIMethodIDCache {
)

private static let cache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "org/swift/swiftkit/core/SimpleCompletableFuture",
methods: [completeMethod, completeExceptionallyMethod]
)
Expand All @@ -81,7 +79,6 @@ extension _JNIMethodIDCache {
private static let messageConstructor = Method(name: "<init>", signature: "(Ljava/lang/String;)V")

private static let cache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "java/lang/Exception",
methods: [messageConstructor]
)
Expand Down
8 changes: 0 additions & 8 deletions Sources/SwiftJavaRuntimeSupport/_JNIBoxedConversions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,47 +26,39 @@ public enum _JNIBoxedConversions {
private static let doubleMethod = _JNIMethodIDCache.Method(name: "valueOf", signature: "(D)Ljava/lang/Double;", isStatic: true)

private static let booleanCache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "java/lang/Boolean",
methods: [booleanMethod]
)

private static let byteCache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "java/lang/Byte",
methods: [byteMethod]
)
private static let charCache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "java/lang/Character",
methods: [charMethod]
)

private static let shortCache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "java/lang/Short",
methods: [shortMethod]
)
private static let intCache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "java/lang/Integer",
methods: [intMethod]
)

private static let longCache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "java/lang/Long",
methods: [longMethod]
)

private static let floatCache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "java/lang/Float",
methods: [floatMethod]
)

private static let doubleCache = _JNIMethodIDCache(
environment: try! JavaVirtualMachine.shared().environment(),
className: "java/lang/Double",
methods: [doubleMethod]
)
Expand Down
Loading
Loading