Skip to content

Commit 3819e71

Browse files
committed
Updated JNI use
1 parent 7d3fb8d commit 3819e71

File tree

7 files changed

+189
-54
lines changed

7 files changed

+189
-54
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/Android.swift

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,61 @@ import JNI
1010
/// Android namespace.
1111
public enum Android: JavaPackage {
1212

13-
public static let package = ["android"]
13+
public static let package: JNIPackage = ["android"]
1414

1515
public enum Content: JavaPackage {
1616

17-
public static let package = Android.package + ["content"]
17+
public static let package: JNIPackage = Android.package + ["content"]
1818
}
1919

2020
public enum Widget: JavaPackage {
2121

22-
public static let package = Android.package + ["widget"]
22+
public static let package: JNIPackage = Android.package + ["widget"]
2323
}
2424

2525
public enum View: JavaPackage {
2626

27-
public static let package = Android.package + ["view"]
27+
public static let package: JNIPackage = Android.package + ["view"]
2828
}
2929

3030
public enum Bluetooth: JavaPackage {
3131

32-
public static let package = Android.package + ["bluetooth"]
32+
public static let package: JNIPackage = Android.package + ["bluetooth"]
3333

3434
public enum LE: JavaPackage {
3535

36-
public static let package = Android.Bluetooth.package + ["le"]
36+
public static let package: JNIPackage = Android.Bluetooth.package + ["le"]
3737
}
3838
}
3939
}
4040

41+
internal extension Android {
42+
43+
internal enum SwiftSupport: JavaPackage {
44+
45+
static let package: JNIPackage = ["org", "pureswift", "swiftandroidsupport"]
46+
}
47+
}
48+
4149
public protocol JavaPackage {
4250

43-
static var package: [String] { get }
51+
static var package: JNIPackage { get }
52+
}
53+
54+
public extension JavaPackage {
55+
56+
static func className(_ metaClass: JNIMetaClass) -> JNIClassName {
57+
58+
return (Self.package ☕️ metaClass)
59+
}
60+
}
61+
62+
internal extension JNIPackage {
63+
64+
static func + (lhs: JNIPackage, rhs: [String]) -> JNIPackage {
65+
66+
return JNIPackage(elements: lhs.elements + rhs)!
67+
}
4468
}
69+
70+

Sources/BluetoothAdapter.swift

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import Foundation
99
import java_swift
10+
import JNI
1011

1112
public extension Android.Bluetooth {
1213

@@ -15,10 +16,6 @@ public extension Android.Bluetooth {
1516

1617
public final class AndroidBluetoothAdapter: JavaObject {
1718

18-
fileprivate static let javaClassName = "android/bluetooth/BluetoothAdapter"
19-
20-
private static var JNIClass: jclass?
21-
2219
public convenience init?( casting object: java_swift.JavaObject,
2320
_ file: StaticString = #file,
2421
_ line: Int = #line ) {
@@ -33,9 +30,7 @@ public final class AndroidBluetoothAdapter: JavaObject {
3330
public required init( javaObject: jobject? ) {
3431
super.init(javaObject: javaObject)
3532
}
36-
37-
private static var getDefaultAdapter_MethodID: jmethodID?
38-
33+
3934
/**
4035
* Get a handle to the default local Bluetooth adapter.
4136
*
@@ -52,11 +47,13 @@ public final class AndroidBluetoothAdapter: JavaObject {
5247

5348
var __args = [jvalue].init(repeating: jvalue(), count: 1)
5449

55-
let __return = JNIMethod.CallStaticObjectMethod(className: javaClassName,
56-
classCache: &JNIClass,
50+
let __return = JNIMethod.CallStaticObjectMethod(className: JNICache.className,
51+
classCache: &JNICache.jniClass,
5752
methodName: "getDefaultAdapter",
58-
methodSig: "()L\(javaClassName);",
59-
methodCache: &getDefaultAdapter_MethodID,
53+
methodSig: JNIMethodSignature(
54+
argumentTypes: [],
55+
returnType: .void).rawValue,
56+
methodCache: &JNICache.MethodID.getDefaultAdapter,
6057
args: &__args,
6158
locals: &__locals)
6259

@@ -96,12 +93,12 @@ public final class AndroidBluetoothAdapter: JavaObject {
9693

9794
var __locals = [jobject]()
9895

99-
var __args = [jvalue].init(repeating: jvalue(), count: 1)
96+
var __args = [jvalue](repeating: jvalue(), count: 1)
10097

10198
let __return = JNIMethod.CallObjectMethod(object: javaObject,
10299
methodName: "getBluetoothLeScanner",
103100
methodSig: "()Landroid/bluetooth/le/BluetoothLeScanner;",
104-
methodCache: &type(of: self).getBluetoothLeScanner_MethodID,
101+
methodCache: &JNICache.MethodID.getBluetoothLeScanner,
105102
args: &__args,
106103
locals: &__locals)
107104

@@ -116,3 +113,27 @@ public final class AndroidBluetoothAdapter: JavaObject {
116113
get { return getBluetoothLeScanner() }
117114
}
118115
}
116+
117+
// MARK: - JNICache
118+
119+
internal extension Android.Bluetooth.Adapter {
120+
121+
/// JNI Cache
122+
struct JNICache {
123+
124+
static let classSignature = Android.Bluetooth.className(["BluetoothAdapter"])
125+
126+
/// JNI Java class name
127+
static let className = classSignature.rawValue
128+
129+
/// JNI Java class
130+
static var jniClass: jclass?
131+
132+
/// JNI Method ID cache
133+
struct MethodID {
134+
135+
static var getDefaultAdapter: jmethodID?
136+
static var getBluetoothLeScanner: jmethodID?
137+
}
138+
}
139+
}

Sources/BluetoothLowEnergyScanCallback.swift

Lines changed: 70 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import Foundation
99
import java_swift
1010
import java_util
11-
//import JNI
11+
import JNI
1212

1313
public extension Android.Bluetooth.LE {
1414

@@ -57,7 +57,7 @@ private func AndroidBluetoothLowEnergyScanCallback_onScanResult( _ __env: Unsafe
5757

5858
let swiftResult = AndroidBluetoothLowEnergyScanResult(javaObject: result)
5959

60-
AndroidBluetoothLowEnergyScanCallback_ListenerLocal_
60+
AndroidBluetoothLowEnergyScanCallbackListenerLocal
6161
.swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject )
6262
.onScanResult(callbackType: swiftCallbackType, result: swiftResult)
6363
}
@@ -73,7 +73,7 @@ private func AndroidBluetoothLowEnergyScanCallback_onBatchScanResults( _ __env:
7373

7474
let results = swiftResultsList?.toArray()?.map { AndroidBluetoothLowEnergyScanResult(casting: $0)! } ?? []
7575

76-
AndroidBluetoothLowEnergyScanCallback_ListenerLocal_
76+
AndroidBluetoothLowEnergyScanCallbackListenerLocal
7777
.swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject )
7878
.onBatchScanResults(results: results)
7979
}
@@ -87,39 +87,24 @@ private func AndroidBluetoothLowEnergyScanCallback_onScanFailed( _ __env: Unsafe
8787

8888
let error = AndroidBluetoothLowEnergyScanCallbackError(rawValue: Int(__errorCode))
8989

90-
AndroidBluetoothLowEnergyScanCallback_ListenerLocal_
90+
AndroidBluetoothLowEnergyScanCallbackListenerLocal
9191
.swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject )
9292
.onScanFailed(error: error)
9393
}
9494

95-
fileprivate class AndroidBluetoothLowEnergyScanCallback_ListenerLocal_: JNILocalProxy<AndroidBluetoothLowEnergyScanCallback, Any> {
95+
internal class AndroidBluetoothLowEnergyScanCallbackListenerLocal: JNILocalProxy<AndroidBluetoothLowEnergyScanCallback, Any> {
9696

9797
fileprivate static let _proxyClass: jclass = {
98-
var natives = [JNINativeMethod]()
9998

100-
let onScanResult_thunk: AndroidBluetoothLowEnergyScanCallback_onScanResult_type = AndroidBluetoothLowEnergyScanCallback_onScanResult
101-
102-
natives.append( JNINativeMethod( name: strdup("__onScanResult"),
103-
signature: strdup("(JILandroid/bluetooth/le/ScanResult;)V"),
104-
fnPtr: unsafeBitCast( onScanResult_thunk, to: UnsafeMutableRawPointer.self ) ) )
105-
106-
let onBatchScanResults_thunk: AndroidBluetoothLowEnergyScanCallback_onBatchScanResults_type = AndroidBluetoothLowEnergyScanCallback_onBatchScanResults
107-
108-
natives.append( JNINativeMethod( name: strdup("__onBatchScanResults"),
109-
signature: strdup("(JLjava/util/List;)V"),
110-
fnPtr: unsafeBitCast( onBatchScanResults_thunk, to: UnsafeMutableRawPointer.self ) ) )
111-
112-
let onScanFailed_thunk: AndroidBluetoothLowEnergyScanCallback_onScanFailed_type = AndroidBluetoothLowEnergyScanCallback_onScanFailed
113-
114-
natives.append( JNINativeMethod( name: strdup("__onScanFailed"),
115-
signature: strdup("(JI)V"),
116-
fnPtr: unsafeBitCast( onScanFailed_thunk, to: UnsafeMutableRawPointer.self ) ) )
117-
118-
natives.append( JNINativeMethod( name: strdup("__finalize"),
119-
signature: strdup("(J)V"),
120-
fnPtr: unsafeBitCast( JNIReleasableProxy__finalize_thunk, to: UnsafeMutableRawPointer.self ) ) )
99+
var natives: [JNINativeMethod] = [
100+
JNICache.Method.onScanResult.method,
101+
JNICache.Method.onBatchScanResults.method,
102+
JNICache.Method.onScanFailed.method,
103+
.finalize
104+
]
121105

122106
let clazz = JNI.FindClass( proxyClassName() )
107+
123108
withUnsafePointer(to: &natives[0]) {
124109
nativesPtr in
125110
if JNI.api.RegisterNatives( JNI.env, clazz, nativesPtr, jint(natives.count) ) != jint(JNI_OK) {
@@ -128,18 +113,74 @@ fileprivate class AndroidBluetoothLowEnergyScanCallback_ListenerLocal_: JNILocal
128113
}
129114

130115
defer { JNI.DeleteLocalRef( clazz ) }
116+
131117
return JNI.api.NewGlobalRef( JNI.env, clazz )!
132118
}()
133119

134-
override open class func proxyClassName() -> String { return "org/pureswift/swiftandroid/SwiftBluetoothScanCallback" }
120+
override open class func proxyClassName() -> String { return JNICache.className }
135121

136122
override open class func proxyClass() -> jclass? { return _proxyClass }
137123
}
138124

139125
extension AndroidBluetoothLowEnergyScanCallback {
140126

141127
public func localJavaObject( _ locals: UnsafeMutablePointer<[jobject]> ) -> jobject? {
142-
return AndroidBluetoothLowEnergyScanCallback_ListenerLocal_( owned: self, proto: self ).localJavaObject( locals )
128+
129+
return AndroidBluetoothLowEnergyScanCallbackListenerLocal( owned: self, proto: self ).localJavaObject( locals )
143130
}
144131

145132
}
133+
134+
internal extension AndroidBluetoothLowEnergyScanCallbackListenerLocal {
135+
136+
/// JNI Cache
137+
struct JNICache {
138+
139+
static let classSignature = Android.SwiftSupport.className(["SwiftBluetoothScanCallback"])
140+
141+
/// JNI Java class name
142+
static let className = classSignature.rawValue
143+
144+
/// JNI Method cache
145+
fileprivate enum Method {
146+
147+
enum onScanResult: JNINativeMethodEntry {
148+
149+
static let name = "__onScanResult"
150+
151+
/// "(JILandroid/bluetooth/le/ScanResult;)V"
152+
static let signature = JNIMethodSignature(
153+
argumentTypes: [
154+
.long,
155+
.object(Android.Bluetooth.LE.ScanResult.JNICache.classSignature)
156+
], returnType: .void)
157+
158+
static let thunk: AndroidBluetoothLowEnergyScanCallback_onScanResult_type = AndroidBluetoothLowEnergyScanCallback_onScanResult
159+
}
160+
161+
enum onBatchScanResults: JNINativeMethodEntry {
162+
163+
static let name = "__onBatchScanResults"
164+
165+
/// "(JLjava/util/List;)V"
166+
static let signature = JNIMethodSignature(
167+
argumentTypes: [
168+
.long,
169+
.object(JNIClassName(rawValue: "java/util/List")!),
170+
], returnType: .void)
171+
172+
static let thunk: AndroidBluetoothLowEnergyScanCallback_onBatchScanResults_type = AndroidBluetoothLowEnergyScanCallback_onBatchScanResults
173+
}
174+
175+
enum onScanFailed: JNINativeMethodEntry {
176+
177+
static let name = "__onScanFailed"
178+
179+
/// "(JI)V"
180+
static let signature = JNIMethodSignature(argumentTypes: [.long, .int], returnType: .void)
181+
182+
static let thunk: AndroidBluetoothLowEnergyScanCallback_onScanFailed_type = AndroidBluetoothLowEnergyScanCallback_onScanFailed
183+
}
184+
}
185+
}
186+
}

Sources/BluetoothLowEnergyScanResult.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import Foundation
99
import java_swift
1010
import java_util
11+
import JNI
1112

1213
public extension Android.Bluetooth.LE {
1314

@@ -71,13 +72,15 @@ public final class AndroidBluetoothLowEnergyScanResult: JavaObject {
7172

7273
// MARK: - JNI
7374

74-
private extension Android.Bluetooth.LE.ScanResult {
75+
internal extension Android.Bluetooth.LE.ScanResult {
7576

7677
/// JNI Cache
7778
struct JNICache {
7879

80+
static let classSignature = Android.Bluetooth.LE.className(["ScanResult"])
81+
7982
/// JNI Java class name
80-
static let className = "android/bluetooth/le/ScanResult"
83+
static let className = classSignature.rawValue
8184

8285
/// JNI Java class
8386
static var jniClass: jclass?

Sources/JNI.swift

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//
2+
// JNI.swift
3+
// Android
4+
//
5+
// Created by Alsey Coleman Miller on 3/22/18.
6+
//
7+
8+
import Foundation
9+
import JNI
10+
import java_swift
11+
12+
internal protocol JNINativeMethodEntry {
13+
14+
associatedtype Thunk
15+
16+
static var name: String { get }
17+
18+
static var signature: JNIMethodSignature { get }
19+
20+
static var thunk: Thunk { get }
21+
}
22+
23+
extension JNINativeMethodEntry {
24+
25+
static var method: JNINativeMethod {
26+
27+
return JNINativeMethod ( name: strdup(name),
28+
signature: strdup(signature.rawValue),
29+
fnPtr: unsafeBitCast( thunk, to: UnsafeMutableRawPointer.self ) )
30+
}
31+
}
32+
33+
extension JNINativeMethod {
34+
35+
static var finalize: JNINativeMethod {
36+
37+
return JNINativeMethod(
38+
name: strdup("__finalize"),
39+
signature: strdup("(J)V"),
40+
fnPtr: unsafeBitCast( JNIReleasableProxy__finalize_thunk, to: UnsafeMutableRawPointer.self ) )
41+
}
42+
}

0 commit comments

Comments
 (0)