Skip to content

Commit 22f8b3a

Browse files
committed
Swift 4.1
1 parent 1d31a0c commit 22f8b3a

File tree

5 files changed

+921
-39
lines changed

5 files changed

+921
-39
lines changed

Sources/JNICore.swift

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,13 @@ public func JNI_OnLoad( jvm: UnsafeMutablePointer<JavaVM?>, ptr: UnsafeRawPointe
2323
#if os(Android)
2424
DispatchQueue.setThreadDetachCallback( JNI_DetachCurrentThread )
2525
#endif
26-
26+
2727
// Save ContextClassLoader for FindClass usage
2828
// When a thread is attached to the VM, the context class loader is the bootstrap loader.
2929
// https://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html
3030
// https://developer.android.com/training/articles/perf-jni.html#faq_FindClass
31-
let threadClass = JNI.api.FindClass(env, "java/lang/Thread")
32-
let currentThreadMethodID = JNI.api.GetStaticMethodID(env, threadClass, "currentThread", "()Ljava/lang/Thread;")
33-
let getContextClassLoaderMethodID = JNI.api.GetMethodID(env, threadClass, "getContextClassLoader", "()Ljava/lang/ClassLoader;")
34-
let currentThread = JNI.api.CallStaticObjectMethodA(env, threadClass, currentThreadMethodID, nil)
35-
JNI.classLoader = JNI.api.NewGlobalRef(env, JNI.api.CallObjectMethodA(env, currentThread, getContextClassLoaderMethodID, nil))
36-
31+
JNI.classLoader = JavaThread.currentThread().getContextClassLoader().withJavaObject { JNI.api.NewGlobalRef( env, $0 ) }
32+
3733
return jint(JNI_VERSION_1_6)
3834
}
3935

@@ -110,18 +106,18 @@ open class JNICore {
110106

111107
var vmOptions = [JavaVMOption]( repeating: JavaVMOption(), count: options?.count ?? 1 )
112108

113-
return withUnsafeMutablePointer(to: &vmOptions[0]) {
109+
return vmOptions.withUnsafeMutableBufferPointer {
114110
(vmOptionsPtr) in
115111
var vmArgs = JavaVMInitArgs()
116112
vmArgs.version = jint(JNI_VERSION_1_6)
117113
vmArgs.nOptions = jint(options?.count ?? 0)
118-
vmArgs.options = vmOptionsPtr
114+
vmArgs.options = vmOptionsPtr.baseAddress
119115

120116
if let options: [String] = options {
121-
for i in 0..<options.count {
117+
for i in 0..<vmOptionsPtr.count {
122118
options[i].withCString {
123119
(cString) in
124-
vmOptions[i].optionString = strdup( cString )
120+
vmOptionsPtr[i].optionString = strdup( cString )
125121
}
126122
}
127123
}
@@ -240,7 +236,7 @@ open class JNICore {
240236
CachedFindClass( "java/lang/Object", &JNICore.java_lang_ObjectClass, file, line )
241237
var arrayClass: jclass? = JNICore.java_lang_ObjectClass
242238
if array?.count != 0 {
243-
arrayClass = JNI.GetObjectClass(array![0], locals)
239+
arrayClass = JNI.GetObjectClass( array![0], locals )
244240
}
245241
else {
246242
#if os(Android)

Sources/JNIType.swift

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ public class JNIType {
6363
}
6464

6565
public static func toJava( value: [Int8]?, locals: UnsafeMutablePointer<[jobject]> ) -> jvalue {
66-
if var value: [Int8] = value, let array: jbyteArray = JNI.api.NewByteArray( JNI.env, jsize(value.count) ) {
67-
withUnsafePointer(to: &value[0]) {
66+
if let value: [Int8] = value, let array: jbyteArray = JNI.api.NewByteArray( JNI.env, jsize(value.count) ) {
67+
value.withUnsafeBufferPointer {
6868
valuePtr in
69-
JNI.api.SetByteArrayRegion( JNI.env, array, 0, jsize(value.count), valuePtr )
69+
JNI.api.SetByteArrayRegion( JNI.env, array, 0, jsize(valuePtr.count), valuePtr.baseAddress )
7070
}
7171
locals.pointee.append( array )
7272
return jvalue( l: array )
@@ -106,10 +106,10 @@ public class JNIType {
106106
}
107107

108108
public static func toJava( value: [Int16]?, locals: UnsafeMutablePointer<[jobject]> ) -> jvalue {
109-
if var value: [Int16] = value, let array: jshortArray = JNI.api.NewShortArray( JNI.env, jsize(value.count) ) {
110-
withUnsafePointer(to: &value[0]) {
109+
if let value: [Int16] = value, let array: jshortArray = JNI.api.NewShortArray( JNI.env, jsize(value.count) ) {
110+
value.withUnsafeBufferPointer {
111111
valuePtr in
112-
JNI.api.SetShortArrayRegion( JNI.env, array, 0, jsize(value.count), valuePtr )
112+
JNI.api.SetShortArrayRegion( JNI.env, array, 0, jsize(valuePtr.count), valuePtr.baseAddress )
113113
}
114114
locals.pointee.append( array )
115115
return jvalue( l: array )
@@ -149,10 +149,10 @@ public class JNIType {
149149
}
150150

151151
public static func toJava( value: [UInt16]?, locals: UnsafeMutablePointer<[jobject]> ) -> jvalue {
152-
if var value: [UInt16] = value, let array: jcharArray = JNI.api.NewCharArray( JNI.env, jsize(value.count) ) {
153-
withUnsafePointer(to: &value[0]) {
152+
if let value: [UInt16] = value, let array: jcharArray = JNI.api.NewCharArray( JNI.env, jsize(value.count) ) {
153+
value.withUnsafeBufferPointer {
154154
valuePtr in
155-
JNI.api.SetCharArrayRegion( JNI.env, array, 0, jsize(value.count), valuePtr )
155+
JNI.api.SetCharArrayRegion( JNI.env, array, 0, jsize(valuePtr.count), valuePtr.baseAddress )
156156
}
157157
locals.pointee.append( array )
158158
return jvalue( l: array )
@@ -192,11 +192,11 @@ public class JNIType {
192192
}
193193

194194
public static func toJava( value: [Int32]?, locals: UnsafeMutablePointer<[jobject]> ) -> jvalue {
195-
if var value: [Int32] = value, let array: jintArray = JNI.api.NewIntArray( JNI.env, jsize(value.count) ) {
196-
withUnsafePointer(to: &value[0]) {
195+
if let value: [Int32] = value, let array: jintArray = JNI.api.NewIntArray( JNI.env, jsize(value.count) ) {
196+
value.withUnsafeBufferPointer {
197197
valuePtr in
198-
valuePtr.withMemoryRebound( to: jint.self, capacity: value.count ) {
199-
JNI.api.SetIntArrayRegion( JNI.env, array, 0, jsize(value.count), $0)
198+
valuePtr.withMemoryRebound( to: jint.self) {
199+
JNI.api.SetIntArrayRegion( JNI.env, array, 0, jsize($0.count), $0.baseAddress )
200200
}
201201
}
202202
locals.pointee.append( array )
@@ -210,10 +210,10 @@ public class JNIType {
210210
defer { if consume { JNI.DeleteLocalRef( from ) } }
211211
let length: jsize = JNI.api.GetArrayLength( JNI.env, from )
212212
var value = [Int32]( repeating: Int32(), count: Int(length) )
213-
withUnsafeMutablePointer(to: &value[0]) {
213+
value.withUnsafeMutableBufferPointer {
214214
valuePtr in
215-
valuePtr.withMemoryRebound( to: jint.self, capacity: value.count ) {
216-
JNI.api.GetIntArrayRegion( JNI.env, from, 0, length, $0 )
215+
valuePtr.withMemoryRebound( to: jint.self ) {
216+
JNI.api.GetIntArrayRegion( JNI.env, from, 0, length, $0.baseAddress )
217217
}
218218
}
219219
return value
@@ -283,10 +283,10 @@ public class JNIType {
283283
}
284284

285285
public static func toJava( value: [Int64]?, locals: UnsafeMutablePointer<[jobject]> ) -> jvalue {
286-
if var value: [Int64] = value, let array: jlongArray = JNI.api.NewLongArray( JNI.env, jsize(value.count) ) {
287-
withUnsafePointer(to: &value[0]) {
286+
if let value: [Int64] = value, let array: jlongArray = JNI.api.NewLongArray( JNI.env, jsize(value.count) ) {
287+
value.withUnsafeBufferPointer {
288288
valuePtr in
289-
JNI.api.SetLongArrayRegion( JNI.env, array, 0, jsize(value.count), valuePtr )
289+
JNI.api.SetLongArrayRegion( JNI.env, array, 0, jsize(valuePtr.count), valuePtr.baseAddress )
290290
}
291291
locals.pointee.append( array )
292292
return jvalue( l: array )
@@ -326,10 +326,10 @@ public class JNIType {
326326
}
327327

328328
public static func toJava( value: [Float]?, locals: UnsafeMutablePointer<[jobject]> ) -> jvalue {
329-
if var value: [Float] = value, let array: jfloatArray = JNI.api.NewFloatArray( JNI.env, jsize(value.count) ) {
330-
withUnsafePointer(to: &value[0]) {
329+
if let value: [Float] = value, let array: jfloatArray = JNI.api.NewFloatArray( JNI.env, jsize(value.count) ) {
330+
value.withUnsafeBufferPointer {
331331
valuePtr in
332-
JNI.api.SetFloatArrayRegion( JNI.env, array, 0, jsize(value.count), valuePtr )
332+
JNI.api.SetFloatArrayRegion( JNI.env, array, 0, jsize(valuePtr.count), valuePtr.baseAddress )
333333
}
334334
locals.pointee.append( array )
335335
return jvalue( l: array )
@@ -369,10 +369,10 @@ public class JNIType {
369369
}
370370

371371
public static func toJava( value: [Double]?, locals: UnsafeMutablePointer<[jobject]> ) -> jvalue {
372-
if var value: [Double] = value, let array: jdoubleArray = JNI.api.NewDoubleArray( JNI.env, jsize(value.count) ) {
373-
withUnsafePointer(to: &value[0]) {
372+
if let value: [Double] = value, let array: jdoubleArray = JNI.api.NewDoubleArray( JNI.env, jsize(value.count) ) {
373+
value.withUnsafeBufferPointer {
374374
valuePtr in
375-
JNI.api.SetDoubleArrayRegion( JNI.env, array, 0, jsize(value.count), valuePtr )
375+
JNI.api.SetDoubleArrayRegion( JNI.env, array, 0, jsize(valuePtr.count), valuePtr.baseAddress )
376376
}
377377
locals.pointee.append( array )
378378
return jvalue( l: array )

0 commit comments

Comments
 (0)