Dev: add CallVoidMethods

This commit is contained in:
Andrew Druk 2017-11-14 19:49:28 +02:00
parent f657785b92
commit e67307d76a
4 changed files with 178 additions and 2 deletions

View File

@ -0,0 +1,104 @@
//
// JNIArgumentProtocol.swift
// SmartMailCoreBridge
//
// Created by Andrew on 11/14/17.
//
import Foundation
import java_swift
public protocol JNIArgumentProtocol {
func value() -> jvalue
}
public struct jnull: JNIArgumentProtocol {
public func value() -> jvalue {
return jvalue()
}
}
extension jint: JNIArgumentProtocol {
public func value() -> jvalue {
return jvalue(i: self)
}
}
extension jbyte: JNIArgumentProtocol {
public func value() -> jvalue {
return jvalue(b: self)
}
}
extension jchar: JNIArgumentProtocol {
public func value() -> jvalue {
return jvalue(c: self)
}
}
extension jshort: JNIArgumentProtocol {
public func value() -> jvalue {
return jvalue(s: self)
}
}
extension jlong: JNIArgumentProtocol {
public func value() -> jvalue {
return jvalue(j: self)
}
}
extension jboolean: JNIArgumentProtocol {
public func value() -> jvalue {
return jvalue(z: self)
}
}
extension jfloat: JNIArgumentProtocol {
public func value() -> jvalue {
return jvalue(f: self)
}
}
extension jdouble: JNIArgumentProtocol {
public func value() -> jvalue {
return jvalue(d: self)
}
}
extension jobject: JNIArgumentProtocol {
public func value() -> jvalue {
NSLog("JNIArgumentProtocol.value jobject")
return jvalue(l: self)
}
}
// For backward compatibility
extension jvalue: JNIArgumentProtocol {
public func value() -> jvalue {
NSLog("JNIArgumentProtocol.value jvalue")
return self
}
}

View File

@ -86,6 +86,10 @@ fileprivate let javaFieldLock = NSLock()
public extension JNICore {
public var NULL: JNIArgumentProtocol {
return jnull()
}
public var TRUE: jboolean {
return jboolean(JNI_TRUE)
}
@ -286,5 +290,29 @@ public extension JNICore {
}
}
// MARK: New API
public func CallVoidMethod(_ object: jobject, _ methodID: jmethodID, _ args: JNIArgumentProtocol...) {
checkArgumentAndWrap(args: args, { argsPtr in
api.CallVoidMethodA(env, object, methodID, argsPtr)
})
}
public func CallStaticVoidMethod(_ clazz: jclass, _ methodID: jmethodID, _ args: JNIArgumentProtocol...) {
checkArgumentAndWrap(args: args, { argsPtr in
api.CallStaticVoidMethodA(env, clazz, methodID, argsPtr)
})
}
private func checkArgumentAndWrap<Result>(args: [JNIArgumentProtocol], _ block: (_ argsPtr: UnsafePointer<jvalue>?) -> Result) -> Result {
if args.count > 0 {
var argsValues = args.map({ $0.value() })
return withUnsafePointer(to: &argsValues[0]) { argsPtr in
return block(argsPtr)
}
}
else {
return block(nil)
}
}
}

View File

@ -0,0 +1,44 @@
//
// JNIObject_JavaCoder.swift
// SmartMailCoreBridge
//
// Created by Andrew on 11/14/17.
//
import Foundation
import java_swift
public extension JNIObject {
public func callVoidMethod(_ methodID: jmethodID, _ args: JNIArgumentProtocol..., locals: UnsafeMutablePointer<[jobject]>? = nil) {
checkArgumentAndWrap(args: args, { argsPtr in
JNI.api.CallVoidMethodA(JNI.env, javaObject, methodID, argsPtr)
})
}
private func checkArgumentAndWrap<Result>(args: [JNIArgumentProtocol], _ block: (_ argsPtr: UnsafePointer<jvalue>?) -> Result, locals: UnsafeMutablePointer<[jobject]>? = nil) -> Result {
if args.count > 0 {
var argsValues = args.map({ $0.value() })
return withUnsafePointer(to: &argsValues[0]) { argsPtr in
defer {
if let locals = locals {
_ = JNI.check(Void.self, locals)
}
}
return block(argsPtr)
}
}
else {
defer {
if let locals = locals {
_ = JNI.check(Void.self, locals)
}
}
return block(nil)
}
}
}

View File

@ -261,7 +261,7 @@ fileprivate class JavaHashMapKeyedContainer<K : CodingKey>: KeyedDecodingContain
throw JavaCodingError.wrongArrayLength
}
if keySig == nil {
keySig = try self.decoder.getJavaClassname(from: object).sig
keySig = self.decoder.getJavaClassname(from: object).sig
}
if keySig == "Ljava/lang/String;" {
let stringKey = try self.decoder.unbox(type: String.self, javaObject: object)