Dev: add CallVoidMethods
This commit is contained in:
parent
f657785b92
commit
e67307d76a
|
@ -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
|
||||
}
|
||||
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue