Skip to content

Commit 0f6140f

Browse files
committed
use thread environments
1 parent 6a75aeb commit 0f6140f

File tree

3 files changed

+35
-19
lines changed

3 files changed

+35
-19
lines changed

Sources/SwiftJava/AnyJavaObject.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ extension AnyJavaObject {
6666
javaHolder.object
6767
}
6868

69-
/// Retrieve the environment in which this Java object resides.
69+
/// Retrieve the environment in which this Java object was created.
7070
public var javaEnvironment: JNIEnvironment {
7171
javaHolder.environment
7272
}

Sources/SwiftJava/JavaObject+MethodCalls.swift

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ extension AnyJavaObject {
104104
resultType: Result.Type
105105
) throws -> jmethodID {
106106
// Retrieve the Java class instance from the object.
107-
let environment = javaEnvironment
107+
let environment = try JavaVirtualMachine.shared().environment()
108+
108109
let thisClass = try environment.translatingJNIExceptions {
109110
environment.interface.GetObjectClass(environment, javaThis)
110111
}!
@@ -115,7 +116,7 @@ extension AnyJavaObject {
115116
methodName: methodName,
116117
parameterTypes: repeat each parameterTypes,
117118
resultType: Result.javaType,
118-
in: javaEnvironment
119+
in: environment
119120
)
120121
}
121122
}
@@ -126,7 +127,8 @@ extension AnyJavaObject {
126127
parameterTypes: repeat (each Param).Type
127128
) throws -> jmethodID {
128129
// Retrieve the Java class instance from the object.
129-
let environment = javaEnvironment
130+
let environment = try JavaVirtualMachine.shared().environment()
131+
130132
let thisClass = try environment.translatingJNIExceptions {
131133
environment.interface.GetObjectClass(environment, javaThis)
132134
}!
@@ -137,7 +139,7 @@ extension AnyJavaObject {
137139
methodName: methodName,
138140
parameterTypes: repeat each parameterTypes,
139141
resultType: .void,
140-
in: javaEnvironment
142+
in: environment
141143
)
142144
}
143145
}
@@ -167,8 +169,10 @@ extension AnyJavaObject {
167169
method: jmethodID,
168170
args: repeat each Param
169171
) throws -> Result {
172+
let environment = try JavaVirtualMachine.shared().environment()
173+
170174
return try Self.javaMethodCall(
171-
in: javaEnvironment,
175+
in: environment,
172176
this: javaThis,
173177
method: method,
174178
args: repeat each args
@@ -229,8 +233,10 @@ extension AnyJavaObject {
229233
method: jmethodID,
230234
args: repeat each Param
231235
) throws {
236+
let environment = try JavaVirtualMachine.shared().environment()
237+
232238
try Self.javaMethodCall(
233-
in: javaEnvironment,
239+
in: environment,
234240
this: javaThis,
235241
method: method,
236242
args: repeat each args
@@ -276,7 +282,7 @@ extension AnyJavaObject {
276282
private func getJNIFieldID<FieldType: JavaValue>(_ fieldName: String, fieldType: FieldType.Type) -> jfieldID?
277283
where FieldType: ~Copyable {
278284
let this = javaThis
279-
let environment = javaEnvironment
285+
let environment = try! JavaVirtualMachine.shared().environment()
280286

281287
// Retrieve the Java class instance from the object.
282288
let thisClass = environment.interface.GetObjectClass(environment, this)!
@@ -289,15 +295,19 @@ extension AnyJavaObject {
289295
fieldType fieldType: FieldType.Type
290296
) -> FieldType where FieldType: ~Copyable {
291297
get {
298+
let environment = try! JavaVirtualMachine.shared().environment()
299+
292300
let fieldID = getJNIFieldID(fieldName, fieldType: fieldType)!
293-
let jniMethod = FieldType.jniFieldGet(in: javaEnvironment)
294-
return FieldType(fromJNI: jniMethod(javaEnvironment, javaThis, fieldID), in: javaEnvironment)
301+
let jniMethod = FieldType.jniFieldGet(in: environment)
302+
return FieldType(fromJNI: jniMethod(environment, javaThis, fieldID), in: environment)
295303
}
296304

297305
nonmutating set {
306+
let environment = try! JavaVirtualMachine.shared().environment()
307+
298308
let fieldID = getJNIFieldID(fieldName, fieldType: fieldType)!
299-
let jniMethod = FieldType.jniFieldSet(in: javaEnvironment)
300-
jniMethod(javaEnvironment, javaThis, fieldID, newValue.getJNIValue(in: javaEnvironment))
309+
let jniMethod = FieldType.jniFieldSet(in: environment)
310+
jniMethod(environment, javaThis, fieldID, newValue.getJNIValue(in: environment))
301311
}
302312
}
303313
}
@@ -311,7 +321,7 @@ extension JavaClass {
311321
resultType: Result.Type
312322
) throws -> Result {
313323
let thisClass = javaThis
314-
let environment = javaEnvironment
324+
let environment = try! JavaVirtualMachine.shared().environment()
315325

316326
// Compute the method signature so we can find the right method, then look up the
317327
// method within the class.
@@ -345,7 +355,7 @@ extension JavaClass {
345355
arguments: repeat each Param
346356
) throws {
347357
let thisClass = javaThis
348-
let environment = javaEnvironment
358+
let environment = try JavaVirtualMachine.shared().environment()
349359

350360
// Compute the method signature so we can find the right method, then look up the
351361
// method within the class.
@@ -372,7 +382,7 @@ extension JavaClass {
372382

373383
/// Retrieve the JNI field ID for a field with the given name and type.
374384
private func getJNIStaticFieldID<FieldType: JavaValue>(_ fieldName: String, fieldType: FieldType.Type) -> jfieldID? {
375-
let environment = javaEnvironment
385+
let environment = try! JavaVirtualMachine.shared().environment()
376386

377387
return environment.interface.GetStaticFieldID(environment, javaThis, fieldName, FieldType.jniMangling)
378388
}
@@ -382,15 +392,19 @@ extension JavaClass {
382392
fieldType fieldType: FieldType.Type
383393
) -> FieldType {
384394
get {
395+
let environment = try! JavaVirtualMachine.shared().environment()
396+
385397
let fieldID = getJNIStaticFieldID(fieldName, fieldType: fieldType)!
386-
let jniMethod = FieldType.jniStaticFieldGet(in: javaEnvironment)
387-
return FieldType(fromJNI: jniMethod(javaEnvironment, javaThis, fieldID), in: javaEnvironment)
398+
let jniMethod = FieldType.jniStaticFieldGet(in: environment)
399+
return FieldType(fromJNI: jniMethod(environment, javaThis, fieldID), in: environment)
388400
}
389401

390402
set {
403+
let environment = try! JavaVirtualMachine.shared().environment()
404+
391405
let fieldID = getJNIStaticFieldID(fieldName, fieldType: fieldType)!
392-
let jniMethod = FieldType.jniStaticFieldSet(in: javaEnvironment)
393-
jniMethod(javaEnvironment, javaThis, fieldID, newValue.getJNIValue(in: javaEnvironment))
406+
let jniMethod = FieldType.jniStaticFieldSet(in: environment)
407+
jniMethod(environment, javaThis, fieldID, newValue.getJNIValue(in: environment))
394408
}
395409
}
396410
}

Sources/SwiftJava/JavaObjectHolder.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public final class JavaObjectHolder {
3232
/// in Swift and the Java virtual machine is free to move or deallocate it.
3333
func forget() {
3434
if let object {
35+
let environment = try! JavaVirtualMachine.shared().environment()
36+
3537
environment.interface.DeleteGlobalRef(environment, object)
3638
self.object = nil
3739
}

0 commit comments

Comments
 (0)