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
6 changes: 3 additions & 3 deletions Sources/SwiftJavaJNICore/BridgedValues/JavaValue+Array.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ extension Array: JavaValue where Element: JavaValue {
public static var javaType: JavaType { .array(Element.javaType) }

public init(fromJNI value: JNIType, in environment: JNIEnvironment) {
let jniCount = environment.interface.GetArrayLength(environment, value)
let count = Int(jniCount)

guard let value else {
self = []
return
}

let jniCount = environment.interface.GetArrayLength(environment, value)
let count = Int(jniCount)

// Fast path for byte types: Since the memory layout of `jbyte` (Int8) and UInt8/Int8 is identical,
// we can rebind the memory and fill it directly without creating an intermediate array.
// This mirrors the optimization in `getJNIValue` in the reverse direction.
Expand Down
19 changes: 19 additions & 0 deletions Tests/SwiftJavaJNICoreTests/JavaEnvironmentTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,25 @@ struct JavaEnvironmentTests {
#expect(env.interface.GetArrayLength(env, inner) == 2)
}

@Test(.enabled(if: isSupportedPlatform))
func fromJNI_nestedArrayWithNullInnerElement() throws {
let env = try JavaVirtualMachine.shared().environment()

let makeOuter = [[UInt8]].jniNewArray(in: env)
let outer = makeOuter(env, 3)

let inner0 = [UInt8(1)].getJNIValue(in: env)
let inner1nil: jobject? = nil // oh no!
let inner2 = [UInt8(2), UInt8(3)].getJNIValue(in: env)

env.interface.SetObjectArrayElement(env, outer, 0, inner0)
env.interface.SetObjectArrayElement(env, outer, 1, inner1nil)
env.interface.SetObjectArrayElement(env, outer, 2, inner2)

let result = [[UInt8]](fromJNI: outer, in: env) // avoid NPE on the inner1nil, just count as 0 length
#expect(result == [[0x01], [], [0x02, 0x03]])
}

@Test(.enabled(if: isSupportedPlatform))
func getJNIValue_nestedInt32Array() throws {
let env = try JavaVirtualMachine.shared().environment()
Expand Down
Loading