diff --git a/JNISwift.xcodeproj/CJNI_Info.plist b/JNI.xcodeproj/CJNI_Info.plist similarity index 100% rename from JNISwift.xcodeproj/CJNI_Info.plist rename to JNI.xcodeproj/CJNI_Info.plist diff --git a/JNISwift.xcodeproj/JNISwift_Info.plist b/JNI.xcodeproj/JNI_Info.plist similarity index 100% rename from JNISwift.xcodeproj/JNISwift_Info.plist rename to JNI.xcodeproj/JNI_Info.plist diff --git a/JNISwift.xcodeproj/project.pbxproj b/JNI.xcodeproj/project.pbxproj similarity index 58% rename from JNISwift.xcodeproj/project.pbxproj rename to JNI.xcodeproj/project.pbxproj index 07c1ad8..5d912cf 100644 --- a/JNISwift.xcodeproj/project.pbxproj +++ b/JNI.xcodeproj/project.pbxproj @@ -7,59 +7,59 @@ objects = { /* Begin PBXBuildFile section */ - 03B38DF51F1FCA9B00B9CDA9 /* Array+JavaParameterConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B38DF41F1FC98800B9CDA9 /* Array+JavaParameterConvertible.swift */; }; - 03B38DF61F1FCA9F00B9CDA9 /* JavaParameterConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B38DF31F1FC98800B9CDA9 /* JavaParameterConvertible.swift */; }; - OBJ_32 /* JNI.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* JNI.swift */; }; - OBJ_33 /* JNIClassManipulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* JNIClassManipulation.swift */; }; - OBJ_34 /* JNIExceptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* JNIExceptions.swift */; }; - OBJ_35 /* JNIMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* JNIMethods.swift */; }; - OBJ_36 /* JNIObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_18 /* JNIObjects.swift */; }; - OBJ_37 /* JNIRefs.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* JNIRefs.swift */; }; - OBJ_38 /* JNIStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* JNIStrings.swift */; }; - OBJ_39 /* SwiftJNI.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_21 /* SwiftJNI.swift */; }; - OBJ_41 /* CJNI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "JNISwift::CJNI::Product" /* CJNI.framework */; }; - OBJ_48 /* jni.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_9 /* jni.c */; }; + OBJ_33 /* Array+JavaParameterConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* Array+JavaParameterConvertible.swift */; }; + OBJ_34 /* JNI.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* JNI.swift */; }; + OBJ_35 /* JNIClassManipulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* JNIClassManipulation.swift */; }; + OBJ_36 /* JNIExceptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* JNIExceptions.swift */; }; + OBJ_37 /* JNIMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_18 /* JNIMethods.swift */; }; + OBJ_38 /* JNIObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* JNIObjects.swift */; }; + OBJ_39 /* JNIRefs.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* JNIRefs.swift */; }; + OBJ_40 /* JNIStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_21 /* JNIStrings.swift */; }; + OBJ_41 /* JavaParameterConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* JavaParameterConvertible.swift */; }; + OBJ_42 /* SwiftJNI.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_23 /* SwiftJNI.swift */; }; + OBJ_44 /* CJNI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "JNI::CJNI::Product" /* CJNI.framework */; }; + OBJ_51 /* cjni.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_9 /* cjni.c */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 5C1D2F2E1F1E277B0006682E /* PBXContainerItemProxy */ = { + 5C2714A61F2B6DC70026BBA9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = OBJ_1 /* Project object */; proxyType = 1; - remoteGlobalIDString = "JNISwift::CJNI"; + remoteGlobalIDString = "JNI::CJNI"; remoteInfo = CJNI; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 03B38DF31F1FC98800B9CDA9 /* JavaParameterConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JavaParameterConvertible.swift; sourceTree = ""; }; - 03B38DF41F1FC98800B9CDA9 /* Array+JavaParameterConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+JavaParameterConvertible.swift"; sourceTree = ""; }; - "JNISwift::CJNI::Product" /* CJNI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CJNI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - "JNISwift::JNISwift::Product" /* JNISwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = JNISwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + "JNI::CJNI::Product" /* CJNI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CJNI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + "JNI::JNI::Product" /* JNI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = JNI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; OBJ_11 /* jni.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = jni.h; sourceTree = ""; }; - OBJ_12 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = "/Users/geordiejay/dev/flowkey/smartphone/RNPlayerComponent/NativePlayerIOS/FlowkeyPlayerSDL/Packages/UIKit/Packages/swift-jni/Sources/CJNI/include/module.modulemap"; sourceTree = ""; }; - OBJ_14 /* JNI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNI.swift; sourceTree = ""; }; - OBJ_15 /* JNIClassManipulation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIClassManipulation.swift; sourceTree = ""; }; - OBJ_16 /* JNIExceptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIExceptions.swift; sourceTree = ""; }; - OBJ_17 /* JNIMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIMethods.swift; sourceTree = ""; }; - OBJ_18 /* JNIObjects.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIObjects.swift; sourceTree = ""; }; - OBJ_19 /* JNIRefs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIRefs.swift; sourceTree = ""; }; - OBJ_20 /* JNIStrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIStrings.swift; sourceTree = ""; }; - OBJ_21 /* SwiftJNI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftJNI.swift; sourceTree = ""; }; + OBJ_12 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = "/Users/geordiejay/dev/flowkey/smartphone/RNPlayerComponent/NativePlayerIOS/FlowkeyPlayerSDL/UIKit/swift-jni/Sources/CJNI/include/module.modulemap"; sourceTree = ""; }; + OBJ_14 /* Array+JavaParameterConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+JavaParameterConvertible.swift"; sourceTree = ""; }; + OBJ_15 /* JNI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNI.swift; sourceTree = ""; }; + OBJ_16 /* JNIClassManipulation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIClassManipulation.swift; sourceTree = ""; }; + OBJ_17 /* JNIExceptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIExceptions.swift; sourceTree = ""; }; + OBJ_18 /* JNIMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIMethods.swift; sourceTree = ""; }; + OBJ_19 /* JNIObjects.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIObjects.swift; sourceTree = ""; }; + OBJ_20 /* JNIRefs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIRefs.swift; sourceTree = ""; }; + OBJ_21 /* JNIStrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JNIStrings.swift; sourceTree = ""; }; + OBJ_22 /* JavaParameterConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JavaParameterConvertible.swift; sourceTree = ""; }; + OBJ_23 /* SwiftJNI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftJNI.swift; sourceTree = ""; }; OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; - OBJ_9 /* jni.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = jni.c; sourceTree = ""; }; + OBJ_9 /* cjni.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = cjni.c; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - OBJ_40 /* Frameworks */ = { + OBJ_43 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 0; files = ( - OBJ_41 /* CJNI.framework in Frameworks */, + OBJ_44 /* CJNI.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_49 /* Frameworks */ = { + OBJ_52 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 0; files = ( @@ -78,55 +78,56 @@ path = include; sourceTree = ""; }; - OBJ_13 /* JNISwift */ = { + OBJ_13 /* JNI */ = { isa = PBXGroup; children = ( - 03B38DF41F1FC98800B9CDA9 /* Array+JavaParameterConvertible.swift */, - 03B38DF31F1FC98800B9CDA9 /* JavaParameterConvertible.swift */, - OBJ_14 /* JNI.swift */, - OBJ_15 /* JNIClassManipulation.swift */, - OBJ_16 /* JNIExceptions.swift */, - OBJ_17 /* JNIMethods.swift */, - OBJ_18 /* JNIObjects.swift */, - OBJ_19 /* JNIRefs.swift */, - OBJ_20 /* JNIStrings.swift */, - OBJ_21 /* SwiftJNI.swift */, + OBJ_14 /* Array+JavaParameterConvertible.swift */, + OBJ_15 /* JNI.swift */, + OBJ_16 /* JNIClassManipulation.swift */, + OBJ_17 /* JNIExceptions.swift */, + OBJ_18 /* JNIMethods.swift */, + OBJ_19 /* JNIObjects.swift */, + OBJ_20 /* JNIRefs.swift */, + OBJ_21 /* JNIStrings.swift */, + OBJ_22 /* JavaParameterConvertible.swift */, + OBJ_23 /* SwiftJNI.swift */, ); - name = JNISwift; - path = Sources/JNISwift; + name = JNI; + path = Sources/JNI; sourceTree = SOURCE_ROOT; }; - OBJ_22 /* Tests */ = { + OBJ_24 /* Tests */ = { isa = PBXGroup; children = ( ); name = Tests; sourceTree = SOURCE_ROOT; }; - OBJ_24 /* Products */ = { + OBJ_25 /* Products */ = { isa = PBXGroup; children = ( - "JNISwift::JNISwift::Product" /* JNISwift.framework */, - "JNISwift::CJNI::Product" /* CJNI.framework */, + "JNI::JNI::Product" /* JNI.framework */, + "JNI::CJNI::Product" /* CJNI.framework */, ); name = Products; sourceTree = BUILT_PRODUCTS_DIR; }; - OBJ_5 = { + OBJ_5 /* */ = { isa = PBXGroup; children = ( OBJ_6 /* Package.swift */, OBJ_7 /* Sources */, - OBJ_22 /* Tests */, - OBJ_24 /* Products */, + OBJ_24 /* Tests */, + OBJ_25 /* Products */, ); + name = ""; sourceTree = ""; }; OBJ_7 /* Sources */ = { isa = PBXGroup; children = ( OBJ_8 /* CJNI */, - OBJ_13 /* JNISwift */, + OBJ_13 /* JNI */, ); name = Sources; sourceTree = SOURCE_ROOT; @@ -134,7 +135,7 @@ OBJ_8 /* CJNI */ = { isa = PBXGroup; children = ( - OBJ_9 /* jni.c */, + OBJ_9 /* cjni.c */, OBJ_10 /* include */, ); name = CJNI; @@ -144,12 +145,12 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - "JNISwift::CJNI" /* CJNI */ = { + "JNI::CJNI" /* CJNI */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_44 /* Build configuration list for PBXNativeTarget "CJNI" */; + buildConfigurationList = OBJ_47 /* Build configuration list for PBXNativeTarget "CJNI" */; buildPhases = ( - OBJ_47 /* Sources */, - OBJ_49 /* Frameworks */, + OBJ_50 /* Sources */, + OBJ_52 /* Frameworks */, ); buildRules = ( ); @@ -157,24 +158,24 @@ ); name = CJNI; productName = CJNI; - productReference = "JNISwift::CJNI::Product" /* CJNI.framework */; + productReference = "JNI::CJNI::Product" /* CJNI.framework */; productType = "com.apple.product-type.framework"; }; - "JNISwift::JNISwift" /* JNISwift */ = { + "JNI::JNI" /* JNI */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_28 /* Build configuration list for PBXNativeTarget "JNISwift" */; + buildConfigurationList = OBJ_29 /* Build configuration list for PBXNativeTarget "JNI" */; buildPhases = ( - OBJ_31 /* Sources */, - OBJ_40 /* Frameworks */, + OBJ_32 /* Sources */, + OBJ_43 /* Frameworks */, ); buildRules = ( ); dependencies = ( - OBJ_42 /* PBXTargetDependency */, + OBJ_45 /* PBXTargetDependency */, ); - name = JNISwift; - productName = JNISwift; - productReference = "JNISwift::JNISwift::Product" /* JNISwift.framework */; + name = JNI; + productName = JNI; + productReference = "JNI::JNI::Product" /* JNI.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -185,86 +186,61 @@ attributes = { LastUpgradeCheck = 9999; }; - buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "JNISwift" */; + buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "JNI" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); - mainGroup = OBJ_5; - productRefGroup = OBJ_24 /* Products */; + mainGroup = OBJ_5 /* */; + productRefGroup = OBJ_25 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - "JNISwift::JNISwift" /* JNISwift */, - "JNISwift::CJNI" /* CJNI */, + "JNI::JNI" /* JNI */, + "JNI::CJNI" /* CJNI */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - OBJ_31 /* Sources */ = { + OBJ_32 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - OBJ_32 /* JNI.swift in Sources */, - 03B38DF51F1FCA9B00B9CDA9 /* Array+JavaParameterConvertible.swift in Sources */, - OBJ_33 /* JNIClassManipulation.swift in Sources */, - OBJ_34 /* JNIExceptions.swift in Sources */, - OBJ_35 /* JNIMethods.swift in Sources */, - OBJ_36 /* JNIObjects.swift in Sources */, - OBJ_37 /* JNIRefs.swift in Sources */, - OBJ_38 /* JNIStrings.swift in Sources */, - OBJ_39 /* SwiftJNI.swift in Sources */, - 03B38DF61F1FCA9F00B9CDA9 /* JavaParameterConvertible.swift in Sources */, + OBJ_33 /* Array+JavaParameterConvertible.swift in Sources */, + OBJ_34 /* JNI.swift in Sources */, + OBJ_35 /* JNIClassManipulation.swift in Sources */, + OBJ_36 /* JNIExceptions.swift in Sources */, + OBJ_37 /* JNIMethods.swift in Sources */, + OBJ_38 /* JNIObjects.swift in Sources */, + OBJ_39 /* JNIRefs.swift in Sources */, + OBJ_40 /* JNIStrings.swift in Sources */, + OBJ_41 /* JavaParameterConvertible.swift in Sources */, + OBJ_42 /* SwiftJNI.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_47 /* Sources */ = { + OBJ_50 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - OBJ_48 /* jni.c in Sources */, + OBJ_51 /* cjni.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - OBJ_42 /* PBXTargetDependency */ = { + OBJ_45 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = "JNISwift::CJNI" /* CJNI */; - targetProxy = 5C1D2F2E1F1E277B0006682E /* PBXContainerItemProxy */; + target = "JNI::CJNI" /* CJNI */; + targetProxy = 5C2714A61F2B6DC70026BBA9 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - OBJ_29 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ENABLE_TESTABILITY = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/Sources/CJNI/include", - ); - INFOPLIST_FILE = JNISwift.xcodeproj/JNISwift_Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; - OTHER_LDFLAGS = "$(inherited)"; - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Sources/CJNI/include/module.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = JNISwift; - PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - TARGET_NAME = JNISwift; - }; - name = Debug; - }; OBJ_3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -287,7 +263,32 @@ }; name = Debug; }; - OBJ_30 /* Release */ = { + OBJ_30 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/Sources/CJNI/include", + ); + INFOPLIST_FILE = JNI.xcodeproj/JNI_Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + OTHER_LDFLAGS = "$(inherited)"; + OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Sources/CJNI/include/module.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = JNI; + PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; + TARGET_NAME = JNI; + }; + name = Debug; + }; + OBJ_31 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ENABLE_TESTABILITY = YES; @@ -299,16 +300,16 @@ "$(inherited)", "$(SRCROOT)/Sources/CJNI/include", ); - INFOPLIST_FILE = JNISwift.xcodeproj/JNISwift_Info.plist; + INFOPLIST_FILE = JNI.xcodeproj/JNI_Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Sources/CJNI/include/module.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = JNISwift; + PRODUCT_BUNDLE_IDENTIFIER = JNI; PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - TARGET_NAME = JNISwift; + SWIFT_VERSION = 4.0; + TARGET_NAME = JNI; }; name = Release; }; @@ -332,7 +333,7 @@ }; name = Release; }; - OBJ_45 /* Debug */ = { + OBJ_48 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { DEFINES_MODULE = NO; @@ -345,7 +346,7 @@ "$(inherited)", "$(SRCROOT)/Sources/CJNI/include", ); - INFOPLIST_FILE = JNISwift.xcodeproj/CJNI_Info.plist; + INFOPLIST_FILE = JNI.xcodeproj/CJNI_Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -357,7 +358,7 @@ }; name = Debug; }; - OBJ_46 /* Release */ = { + OBJ_49 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { DEFINES_MODULE = NO; @@ -370,7 +371,7 @@ "$(inherited)", "$(SRCROOT)/Sources/CJNI/include", ); - INFOPLIST_FILE = JNISwift.xcodeproj/CJNI_Info.plist; + INFOPLIST_FILE = JNI.xcodeproj/CJNI_Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -385,7 +386,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - OBJ_2 /* Build configuration list for PBXProject "JNISwift" */ = { + OBJ_2 /* Build configuration list for PBXProject "JNI" */ = { isa = XCConfigurationList; buildConfigurations = ( OBJ_3 /* Debug */, @@ -394,20 +395,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - OBJ_28 /* Build configuration list for PBXNativeTarget "JNISwift" */ = { + OBJ_29 /* Build configuration list for PBXNativeTarget "JNI" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_29 /* Debug */, - OBJ_30 /* Release */, + OBJ_30 /* Debug */, + OBJ_31 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - OBJ_44 /* Build configuration list for PBXNativeTarget "CJNI" */ = { + OBJ_47 /* Build configuration list for PBXNativeTarget "CJNI" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_45 /* Debug */, - OBJ_46 /* Release */, + OBJ_48 /* Debug */, + OBJ_49 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; diff --git a/JNISwift.xcodeproj/xcshareddata/xcschemes/JNISwift.xcscheme b/JNI.xcodeproj/xcshareddata/xcschemes/JNI-Package.xcscheme similarity index 82% rename from JNISwift.xcodeproj/xcshareddata/xcschemes/JNISwift.xcscheme rename to JNI.xcodeproj/xcshareddata/xcschemes/JNI-Package.xcscheme index 1dfd20b..f067174 100644 --- a/JNISwift.xcodeproj/xcshareddata/xcschemes/JNISwift.xcscheme +++ b/JNI.xcodeproj/xcshareddata/xcschemes/JNI-Package.xcscheme @@ -1,7 +1,7 @@ + version = "1.3"> @@ -14,10 +14,10 @@ buildForAnalyzing = "YES"> + BlueprintIdentifier = "JNI::JNI" + BuildableName = "JNI.framework" + BlueprintName = "JNI" + ReferencedContainer = "container:JNI.xcodeproj"> + ReferencedContainer = "container:JNI.xcodeproj"> @@ -51,6 +51,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" @@ -60,10 +61,10 @@ + BlueprintIdentifier = "JNI::JNI" + BuildableName = "JNI.framework" + BlueprintName = "JNI" + ReferencedContainer = "container:JNI.xcodeproj"> diff --git a/JNISwift.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist b/JNI.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist similarity index 83% rename from JNISwift.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist rename to JNI.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist index 6566254..f212055 100644 --- a/JNISwift.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist +++ b/JNI.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist @@ -3,7 +3,7 @@ SchemeUserState - JNISwift-Package.xcscheme + JNI-Package.xcscheme SuppressBuildableAutocreation diff --git a/JNISwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/JNISwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/JNISwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/JNISwift.xcodeproj/xcshareddata/xcschemes/JNISwift-Package.xcscheme b/JNISwift.xcodeproj/xcshareddata/xcschemes/JNISwift-Package.xcscheme deleted file mode 100644 index 55091cd..0000000 --- a/JNISwift.xcodeproj/xcshareddata/xcschemes/JNISwift-Package.xcscheme +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Package.swift b/Package.swift index a0a0192..80d2aaf 100644 --- a/Package.swift +++ b/Package.swift @@ -1,13 +1,14 @@ -// swift-tools-version:3.1 +// swift-tools-version:4.0 import PackageDescription let package = Package( - name: "JNISwift", + name: "JNI", + products: [ + .library(name: "JNI", type: .dynamic, targets: ["JNI", "CJNI"]) + ], targets: [ - Target(name: "JNISwift", dependencies: ["CJNI"]), - Target(name: "CJNI", dependencies: []) + .target(name: "CJNI"), + .target(name: "JNI", dependencies: ["CJNI"]) ] ) - -products.append(Product(name: "JNISwift", type: .Library(.Dynamic), modules: ["JNISwift"])) diff --git a/Sources/CJNI/cjni.c b/Sources/CJNI/cjni.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Sources/CJNI/cjni.c @@ -0,0 +1 @@ + diff --git a/Sources/CJNI/include/jni.h b/Sources/CJNI/include/jni.h index 47dc543..8390d1d 100644 --- a/Sources/CJNI/include/jni.h +++ b/Sources/CJNI/include/jni.h @@ -383,7 +383,7 @@ struct JNINativeInterface jstring (* _Nonnull NewString)(JNIEnv * _Nonnull, const jchar * _Nonnull, jsize); jsize (* _Nonnull GetStringLength)(JNIEnv * _Nonnull, jstring); - const jchar *(* _Nonnull GetStringChars)(JNIEnv * _Nonnull, jstring, jboolean * _Nullable); + const jchar * _Nullable(* _Nonnull GetStringChars)(JNIEnv * _Nonnull, jstring, jboolean * _Nullable); void (* _Nonnull ReleaseStringChars)(JNIEnv * _Nonnull, jstring, const jchar * _Nonnull); jstring (* _Nonnull NewStringUTF)(JNIEnv * _Nonnull, const char * _Nonnull); jsize (* _Nonnull GetStringUTFLength)(JNIEnv * _Nonnull, jstring); @@ -413,14 +413,14 @@ struct JNINativeInterface jfloat * _Nullable (* _Nonnull GetFloatArrayElements)(JNIEnv * _Nonnull, jfloatArray, jboolean * _Nonnull); jdouble * _Nullable (* _Nonnull GetDoubleArrayElements)(JNIEnv * _Nonnull, jdoubleArray, jboolean * _Nonnull); - void (* _Nonnull ReleaseBooleanArrayElements)(JNIEnv * _Nonnull, jbooleanArray, jboolean *, jint) CF_SWIFT_NAME(ReleaseArrayElements); - void (* _Nonnull ReleaseByteArrayElements)(JNIEnv * _Nonnull, jbyteArray, jbyte *, jint) CF_SWIFT_NAME(ReleaseArrayElements); - void (* _Nonnull ReleaseCharArrayElements)(JNIEnv * _Nonnull, jcharArray, jchar *, jint) CF_SWIFT_NAME(ReleaseArrayElements); - void (* _Nonnull ReleaseShortArrayElements)(JNIEnv * _Nonnull, jshortArray, jshort *, jint) CF_SWIFT_NAME(ReleaseArrayElements); - void (* _Nonnull ReleaseIntArrayElements)(JNIEnv * _Nonnull, jintArray, jint *, jint) CF_SWIFT_NAME(ReleaseArrayElements); - void (* _Nonnull ReleaseLongArrayElements)(JNIEnv * _Nonnull, jlongArray, jlong *, jint) CF_SWIFT_NAME(ReleaseArrayElements); - void (* _Nonnull ReleaseFloatArrayElements)(JNIEnv * _Nonnull, jfloatArray, jfloat *, jint) CF_SWIFT_NAME(ReleaseArrayElements); - void (* _Nonnull ReleaseDoubleArrayElements)(JNIEnv * _Nonnull, jdoubleArray, jdouble *, jint) CF_SWIFT_NAME(ReleaseArrayElements); + void (* _Nonnull ReleaseBooleanArrayElements)(JNIEnv * _Nonnull, jbooleanArray, jboolean * _Nullable, jint) CF_SWIFT_NAME(ReleaseArrayElements); + void (* _Nonnull ReleaseByteArrayElements)(JNIEnv * _Nonnull, jbyteArray, jbyte * _Nullable, jint) CF_SWIFT_NAME(ReleaseArrayElements); + void (* _Nonnull ReleaseCharArrayElements)(JNIEnv * _Nonnull, jcharArray, jchar * _Nullable, jint) CF_SWIFT_NAME(ReleaseArrayElements); + void (* _Nonnull ReleaseShortArrayElements)(JNIEnv * _Nonnull, jshortArray, jshort * _Nullable, jint) CF_SWIFT_NAME(ReleaseArrayElements); + void (* _Nonnull ReleaseIntArrayElements)(JNIEnv * _Nonnull, jintArray, jint * _Nullable, jint) CF_SWIFT_NAME(ReleaseArrayElements); + void (* _Nonnull ReleaseLongArrayElements)(JNIEnv * _Nonnull, jlongArray, jlong * _Nullable, jint) CF_SWIFT_NAME(ReleaseArrayElements); + void (* _Nonnull ReleaseFloatArrayElements)(JNIEnv * _Nonnull, jfloatArray, jfloat * _Nullable, jint) CF_SWIFT_NAME(ReleaseArrayElements); + void (* _Nonnull ReleaseDoubleArrayElements)(JNIEnv * _Nonnull, jdoubleArray, jdouble * _Nullable, jint) CF_SWIFT_NAME(ReleaseArrayElements); void (* _Nonnull GetBooleanArrayRegion)(JNIEnv * _Nonnull, jbooleanArray, jsize, jsize, jboolean * _Nonnull); void (* _Nonnull GetByteArrayRegion)(JNIEnv * _Nonnull, jbyteArray, jsize, jsize, jbyte * _Nonnull); @@ -441,7 +441,7 @@ struct JNINativeInterface void (* _Nonnull SetFloatArrayRegion)(JNIEnv * _Nonnull, jfloatArray, jsize, jsize, const jfloat * _Nonnull) CF_SWIFT_NAME(SetArrayRegion); void (* _Nonnull SetDoubleArrayRegion)(JNIEnv * _Nonnull, jdoubleArray, jsize, jsize, const jdouble * _Nonnull) CF_SWIFT_NAME(SetArrayRegion); - jint (* _Nonnull RegisterNatives)(JNIEnv * _Nonnull, jclass, const JNINativeMethod *, jint); + jint (* _Nonnull RegisterNatives)(JNIEnv * _Nonnull, jclass, const JNINativeMethod * _Nonnull, jint); jint (* _Nonnull UnregisterNatives)(JNIEnv * _Nonnull, jclass); jint (* _Nonnull MonitorEnter)(JNIEnv * _Nonnull, jobject); jint (* _Nonnull MonitorExit)(JNIEnv * _Nonnull, jobject); @@ -450,11 +450,11 @@ struct JNINativeInterface void (* _Nonnull GetStringRegion)(JNIEnv * _Nonnull, jstring, jsize, jsize, jchar * _Nonnull); void (* _Nonnull GetStringUTFRegion)(JNIEnv * _Nonnull, jstring, jsize, jsize, char * _Nonnull); - void *(* _Nonnull GetPrimitiveArrayCritical)(JNIEnv * _Nonnull, jarray, jboolean * _Nonnull); - void (* _Nonnull ReleasePrimitiveArrayCritical)(JNIEnv * _Nonnull, jarray, void *, jint); + void * _Nullable(* _Nonnull GetPrimitiveArrayCritical)(JNIEnv * _Nonnull, jarray, jboolean * _Nonnull); + void (* _Nonnull ReleasePrimitiveArrayCritical)(JNIEnv * _Nonnull, jarray, void * _Nullable, jint); - const jchar *(* _Nonnull GetStringCritical)(JNIEnv * _Nonnull, jstring, jboolean * _Nonnull); - void (* _Nonnull ReleaseStringCritical)(JNIEnv * _Nonnull, jstring, const jchar * _Nonnull); + const jchar * _Nullable(* _Nonnull GetStringCritical)(JNIEnv * _Nonnull, jstring, jboolean * _Nonnull); + void (* _Nonnull ReleaseStringCritical)(JNIEnv * _Nonnull, jstring, const jchar * _Nullable); jweak (* _Nonnull NewWeakGlobalRef)(JNIEnv * _Nonnull, jobject); void (* _Nonnull DeleteWeakGlobalRef)(JNIEnv * _Nonnull, jweak); @@ -1332,15 +1332,15 @@ struct _JNIEnv */ struct JNIInvokeInterface { - void *reserved0; - void *reserved1; - void *reserved2; + void * _Null_unspecified reserved0; + void * _Null_unspecified reserved1; + void * _Null_unspecified reserved2; jint (* _Nonnull DestroyJavaVM)(JavaVM * _Nonnull); - jint (* _Nonnull AttachCurrentThread)(JavaVM *, JNIEnv **, void * _Nullable); + jint (* _Nonnull AttachCurrentThread)(JavaVM * _Nonnull, JNIEnv * _Nullable * _Nullable, void * _Nullable); jint (* _Nonnull DetachCurrentThread)(JavaVM * _Nonnull); - jint (* _Nonnull GetEnv)(JavaVM *, void **, jint); - jint (* _Nonnull AttachCurrentThreadAsDaemon)(JavaVM *, JNIEnv **, void * _Nonnull); + jint (* _Nonnull GetEnv)(JavaVM * _Nonnull, void * _Nullable * _Nullable, jint); + jint (* _Nonnull AttachCurrentThreadAsDaemon)(JavaVM * _Nonnull, JNIEnv * _Nullable * _Nullable, void * _Nullable); }; /* @@ -1348,7 +1348,7 @@ struct JNIInvokeInterface */ struct _JavaVM { - const struct JNIInvokeInterface *functions; + const struct JNIInvokeInterface * _Nonnull functions; #if defined(__cplusplus) jint DestroyJavaVM() @@ -1376,9 +1376,9 @@ struct _JavaVM struct JavaVMAttachArgs { - jint version; /* must be >= JNI_VERSION_1_2 */ - const char *name; /* NULL or name of thread as modified UTF-8 str */ - jobject group; /* global ref of a ThreadGroup object, or NULL */ + jint version; /** must be >= JNI_VERSION_1_2 */ + const char * _Nullable name; /** NULL or name of thread as modified UTF-8 str */ + jobject group; /** global ref of a ThreadGroup object, or NULL */ }; typedef struct JavaVMAttachArgs JavaVMAttachArgs; @@ -1388,8 +1388,8 @@ typedef struct JavaVMAttachArgs JavaVMAttachArgs; */ typedef struct JavaVMOption { - const char *optionString; - void *extraInfo; + const char * _Nullable optionString; + void * _Nullable extraInfo; } JavaVMOption; typedef struct JavaVMInitArgs @@ -1397,7 +1397,7 @@ typedef struct JavaVMInitArgs jint version; /* use JNI_VERSION_1_2 or later */ jint nOptions; - JavaVMOption *options; + JavaVMOption * _Nonnull options; jboolean ignoreUnrecognized; } JavaVMInitArgs; @@ -1423,8 +1423,8 @@ jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize* _Nonnull); * Prototypes for functions exported by loadable shared libs. These are * called by JNI, not provided by JNI. */ -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved); -JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved); +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * _Nonnull vm, void * _Null_unspecified reserved); +JNIEXPORT void JNICALL JNI_OnUnload(JavaVM * _Nonnull vm, void * _Null_unspecified reserved); #ifdef __cplusplus } diff --git a/Sources/CJNI/include/module.modulemap b/Sources/CJNI/include/module.modulemap index d24ac59..da22ce8 100644 --- a/Sources/CJNI/include/module.modulemap +++ b/Sources/CJNI/include/module.modulemap @@ -2,4 +2,3 @@ module CJNI { header "jni.h" export * } - diff --git a/Sources/CJNI/jni.c b/Sources/CJNI/jni.c deleted file mode 100644 index 82acb49..0000000 --- a/Sources/CJNI/jni.c +++ /dev/null @@ -1,4 +0,0 @@ -// Stub method to avoid no debug symbol warning from compiler. -int swiftpm_cjni_anchor() { - return 0; -} diff --git a/Sources/JNI/Array+JavaParameterConvertible.swift b/Sources/JNI/Array+JavaParameterConvertible.swift new file mode 100644 index 0000000..1e0318a --- /dev/null +++ b/Sources/JNI/Array+JavaParameterConvertible.swift @@ -0,0 +1,39 @@ +// +// Array+JavaParameterConvertible.swift +// JNI +// +// Created by flowing erik on 19.07.17. +// + +import CJNI + +extension String { + func replacingFullstopsWithSlashes() -> String { + let replacedCharacters = self.characters.map { ($0 == ".") ? "/" : $0 } + return String(String.CharacterView(replacedCharacters)) + } +} + +extension Array where Element == JavaParameterConvertible { + func asJavaParameters() -> [JavaParameter] { + return self.map { $0.toJavaParameter() } + } + + /// Returns the String of ordererd arguments for use in JNI method signatures. + /// For example, the `"II"` in `(II)V` + private func argumentSignature() -> String { + return self.reduce("", { $0 + type(of: $1).asJNIParameterString }) + } + + /// Returns the String of ordered arguments enclosed in brackets, followed by the `returnType`'s type string, or 'V' + /// (Void) if nil is provided. e.g. Returns "(II)V" for `[JavaInt(1), JavaInt(99)].methodSignature(returnType: nil)` + func methodSignature(returnType: JavaParameterConvertible.Type?) -> String { + let returnTypeString = returnType?.asJNIParameterString ?? "V" + return "(" + self.argumentSignature() + ")" + returnTypeString + } + + func methodSignature(customReturnType: String) -> String { + let returnTypeString = customReturnType.replacingFullstopsWithSlashes() + return "(" + self.argumentSignature() + ")" + returnTypeString + } +} diff --git a/Sources/JNISwift/JNI.swift b/Sources/JNI/JNI.swift similarity index 95% rename from Sources/JNISwift/JNI.swift rename to Sources/JNI/JNI.swift index 3101980..2b704c1 100644 --- a/Sources/JNISwift/JNI.swift +++ b/Sources/JNI/JNI.swift @@ -1,4 +1,4 @@ -import CJNI +@_exported import CJNI // "_exported" so we don't have to import both CJNI and JNI all the time public class JNI { /// Our reference to the Java Virtual Machine, to be set on init diff --git a/Sources/JNISwift/JNIClassManipulation.swift b/Sources/JNI/JNIClassManipulation.swift similarity index 93% rename from Sources/JNISwift/JNIClassManipulation.swift rename to Sources/JNI/JNIClassManipulation.swift index 9f52706..e6bba2d 100644 --- a/Sources/JNISwift/JNIClassManipulation.swift +++ b/Sources/JNI/JNIClassManipulation.swift @@ -6,9 +6,9 @@ public extension JNI { // return env.pointee.pointee.DefineClass(env, name, loader, buffer, bufferLength)! // } - public func FindClass(name: String) -> JavaClass { + public func FindClass(name: String) -> JavaClass? { let env = self._env - return env.pointee.pointee.FindClass(env, name)! + return env.pointee.pointee.FindClass(env, name) } public func FromReflectedMethod(method: JavaObject) -> JavaMethodID { diff --git a/Sources/JNISwift/JNIExceptions.swift b/Sources/JNI/JNIExceptions.swift similarity index 100% rename from Sources/JNISwift/JNIExceptions.swift rename to Sources/JNI/JNIExceptions.swift diff --git a/Sources/JNI/JNIMethods.swift b/Sources/JNI/JNIMethods.swift new file mode 100644 index 0000000..3661719 --- /dev/null +++ b/Sources/JNI/JNIMethods.swift @@ -0,0 +1,59 @@ +import CJNI + +struct InvalidMethodID: Error {} + +extension JNI { + // MARK: Static Methods + + public func callStatic(_ methodName: String, on javaClass: JavaClass, arguments: [JavaParameterConvertible] = []) throws { + let methodSignature = arguments.methodSignature(returnType: nil) + let methodID = try jni.GetStaticMethodID(for: javaClass, methodName: methodName, methodSignature: methodSignature) + + try jni.CallStaticVoidMethod(javaClass: javaClass, method: methodID, parameters: arguments.asJavaParameters()) + } + + public func callStatic(_ methodName: String, on javaClass: JavaClass, arguments: [JavaParameterConvertible] = []) throws -> T { + let methodSignature = arguments.methodSignature(returnType: T.self) + let methodID = try jni.GetStaticMethodID(for: javaClass, methodName: methodName, methodSignature: methodSignature) + + return try T.fromStaticMethod(calling: methodID, on: javaClass, args: arguments.asJavaParameters()) + } + + public func callStatic(_ methodName: String, on javaClass: JavaClass, arguments: [JavaParameterConvertible] = [], returningObjectType objectType: String) throws -> JavaObject { + let methodSignature = arguments.methodSignature(customReturnType: "L" + objectType + ";") + let methodID = try jni.GetStaticMethodID(for: javaClass, methodName: methodName, methodSignature: methodSignature) + + return try jni.CallStaticObjectMethod(methodID, on: javaClass, parameters: arguments.asJavaParameters()) + } + + // MARK: Instance/Object Methods + + public func call(_ methodName: String, on object: JavaObject, arguments: [JavaParameterConvertible] = []) throws { + let methodSignature = arguments.methodSignature(returnType: nil) + let methodID = try jni.GetMethodID(for: object, methodName: methodName, methodSignature: methodSignature) + + return try jni.CallVoidMethod(methodID, on: object, parameters: arguments.asJavaParameters()) + } + + public func call(_ methodName: String, on object: JavaObject, arguments: [JavaParameterConvertible] = []) throws -> T { + let methodSignature = arguments.methodSignature(returnType: T.self) + let methodID = try jni.GetMethodID(for: object, methodName: methodName, methodSignature: methodSignature) + + return try T.fromMethod(calling: methodID, on: object, args: arguments.asJavaParameters()) + } + + public func call(_ methodName: String, on object: JavaObject, arguments: [JavaParameterConvertible] = [], returningObjectType objectType: String) throws -> JavaObject { + let methodSignature = arguments.methodSignature(customReturnType: "L" + objectType + ";") + let methodID = try jni.GetMethodID(for: object, methodName: methodName, methodSignature: methodSignature) + + return try jni.CallObjectMethod(methodID, on: object, parameters: arguments.asJavaParameters()) + } + + public func call(_ methodName: String, on object: JavaObject, with arguments: [JavaParameterConvertible]) throws -> [String] { + let methodSignature = arguments.methodSignature(customReturnType: "[" + String.asJNIParameterString) + let methodID = try jni.GetMethodID(for: object, methodName: methodName, methodSignature: methodSignature) + let returnedArray = try jni.CallObjectMethod(methodID, on: object, parameters: arguments.asJavaParameters()) + + return try jni.GetStrings(from: returnedArray) + } +} diff --git a/Sources/JNI/JNIObjects.swift b/Sources/JNI/JNIObjects.swift new file mode 100644 index 0000000..0063f0c --- /dev/null +++ b/Sources/JNI/JNIObjects.swift @@ -0,0 +1,73 @@ +import CJNI + +/// Designed to simplify calling a constructor and methods on a JavaClass +/// Subclass this and add the methods appropriate to the object you are constructing. +open class JNIObject { + public let javaClass: JavaClass + public let instance: JavaObject + + public init?(_ className: String, arguments: [JavaParameterConvertible] = []) { + let className = className.replacingFullstopsWithSlashes() + + guard + let javaClassLocalRef = jni.FindClass(name: className), + let javaClass = jni.NewGlobalRef(javaClassLocalRef) + else { + assertionFailure("Couldn't find class named \(className)") + return nil + } + + self.javaClass = javaClass + + guard + let instanceLocalRef = try? jni.callConstructor(on: javaClass, arguments: arguments), + let instance = jni.NewGlobalRef(instanceLocalRef) + else { + assertionFailure("Couldn't call constructor of \(className)") + return nil + } + + self.instance = instance + } + + public func call(methodName: String, arguments: [JavaParameterConvertible] = []) throws { + try jni.call(methodName, on: self.instance, arguments: arguments) + } + + public func call(methodName: String, arguments: [JavaParameterConvertible] = []) throws -> T { + return try jni.call(methodName, on: self.instance, arguments: arguments) + } + + public func callStatic(methodName: String, arguments: [JavaParameterConvertible] = []) throws { + try jni.callStatic(methodName, on: self.javaClass, arguments: arguments) + } +} + +extension JNI { + func callConstructor(on targetClass: JavaClass, arguments: [JavaParameterConvertible] = []) throws -> JavaObject { + let methodID = try jni.GetMethodID(for: targetClass, methodName: "", methodSignature: arguments.methodSignature(returnType: nil)) + + // There's no reason for this to fail if the methodID was correct: + return jni.NewObject(targetClass: targetClass, methodID, arguments.asJavaParameters())! + } +} + +public extension JNI { + public func AllocObject(targetClass: JavaClass) -> JavaObject? { + let env = self._env + return env.pointee.pointee.AllocObject(env, targetClass) + } + + public func NewObject(targetClass: JavaClass, _ methodID: JavaMethodID, _ args: [JavaParameter]) -> JavaObject? { + let env = self._env + var mutableArgs = args + return env.pointee.pointee.NewObject(env, targetClass, methodID, &mutableArgs) + } + + public func GetObjectClass(obj: JavaObject) -> JavaClass? { + let env = self._env + let result = env.pointee.pointee.GetObjectClass(env, obj) + return (result != nil) ? result : .none + } + +} diff --git a/Sources/JNISwift/JNIRefs.swift b/Sources/JNI/JNIRefs.swift similarity index 87% rename from Sources/JNISwift/JNIRefs.swift rename to Sources/JNI/JNIRefs.swift index 39e019c..b434b6c 100644 --- a/Sources/JNISwift/JNIRefs.swift +++ b/Sources/JNI/JNIRefs.swift @@ -1,9 +1,9 @@ import CJNI public extension JNI { - public func NewGlobalRef(obj: JavaObject) -> JavaObject { + public func NewGlobalRef(_ object: JavaObject) -> JavaObject? { let env = self._env - return env.pointee.pointee.NewGlobalRef(env, obj)! + return env.pointee.pointee.NewGlobalRef(env, object) } public func DeleteGlobalRef(globalRef: JavaObject) { @@ -11,9 +11,9 @@ public extension JNI { env.pointee.pointee.DeleteGlobalRef(env, globalRef) } - public func NewLocalRef(ref: JavaObject) -> JavaObject { + public func NewLocalRef(ref: JavaObject) -> JavaObject? { let env = self._env - return env.pointee.pointee.NewLocalRef(env, ref)! + return env.pointee.pointee.NewLocalRef(env, ref) } public func DeleteLocalRef(localRef: JavaObject) { diff --git a/Sources/JNISwift/JNIStrings.swift b/Sources/JNI/JNIStrings.swift similarity index 100% rename from Sources/JNISwift/JNIStrings.swift rename to Sources/JNI/JNIStrings.swift diff --git a/Sources/JNI/JavaParameterConvertible.swift b/Sources/JNI/JavaParameterConvertible.swift new file mode 100644 index 0000000..e08018c --- /dev/null +++ b/Sources/JNI/JavaParameterConvertible.swift @@ -0,0 +1,87 @@ +// +// JavaParameterConvertible.swift +// JNI +// +// Created by flowing erik on 19.07.17. +// + +import CJNI + +public protocol JavaParameterConvertible { + typealias JavaMethod = ((JavaParameterConvertible...) throws -> Self) + static var asJNIParameterString: String { get } + func toJavaParameter() -> JavaParameter + + static func fromMethod(calling methodID: JavaMethodID, on object: JavaObject, args: [JavaParameter]) throws -> Self + static func fromStaticMethod(calling methodID: JavaMethodID, on javaClass: JavaClass, args: [JavaParameter]) throws -> Self +} + +extension Bool: JavaParameterConvertible { + public static var asJNIParameterString: String { return "Z" } + + public func toJavaParameter() -> JavaParameter { + return JavaParameter(bool: (self) ? 1 : 0) + } + + public static func fromMethod(calling methodID: JavaMethodID, on object: JavaObject, args: [JavaParameter]) throws -> Bool { + return try jni.CallBooleanMethod(methodID, on: object, parameters: args) == JNI_TRUE + } + + public static func fromStaticMethod(calling methodID: JavaMethodID, on javaClass: JavaClass, args: [JavaParameter]) throws -> Bool { + return try jni.CallStaticBooleanMethod(javaClass: javaClass, method: methodID, parameters: args) == JNI_TRUE + } +} + +extension Int: JavaParameterConvertible { + public static var asJNIParameterString: String { return "I" } + + public func toJavaParameter() -> JavaParameter { + return JavaParameter(int: JavaInt(self)) + } + + public static func fromMethod(calling methodID: JavaMethodID, on object: JavaObject, args: [JavaParameter]) throws -> Int { + let result = try jni.CallIntMethod(methodID, on: object, parameters: args) + return Int(result) + } + + public static func fromStaticMethod(calling methodID: JavaMethodID, on javaClass: JavaClass, args: [JavaParameter]) throws -> Int { + let result = try jni.CallStaticIntMethod(methodID, on: javaClass, parameters: args) + return Int(result) + } +} + +extension Double: JavaParameterConvertible { + public static var asJNIParameterString: String { return "D" } + + public func toJavaParameter() -> JavaParameter { + return JavaParameter(double: JavaDouble(self)) + } + + public static func fromMethod(calling methodID: JavaMethodID, on object: JavaObject, args: [JavaParameter]) throws -> Double { + return try jni.CallDoubleMethod(methodID, on: object, parameters: args) + } + + public static func fromStaticMethod(calling methodID: JavaMethodID, on javaClass: JavaClass, args: [JavaParameter]) throws -> Double { + return try jni.CallStaticDoubleMethod(methodID, on: javaClass, parameters: args) + } +} + +extension String: JavaParameterConvertible { + private static let javaClassname = "java/lang/String" + public static let asJNIParameterString = "L\(javaClassname);" + + public func toJavaParameter() -> JavaParameter { + let stringAsObject = jni.NewStringUTF(self) + return JavaParameter(object: stringAsObject) + } + + public static func fromMethod(calling methodID: JavaMethodID, on object: JavaObject, args: [JavaParameter]) throws -> String { + let jObject = try jni.CallObjectMethod(methodID, on: object, parameters: args) + return jni.GetString(from: jObject) + } + + public static func fromStaticMethod(calling methodID: JavaMethodID, on javaClass: JavaClass, args: [JavaParameter]) throws -> String { + let jObject = try jni.CallStaticObjectMethod(methodID, on: javaClass, parameters: args) + return jni.GetString(from: jObject) + } +} diff --git a/Sources/JNISwift/SwiftJNI.swift b/Sources/JNI/SwiftJNI.swift similarity index 82% rename from Sources/JNISwift/SwiftJNI.swift rename to Sources/JNI/SwiftJNI.swift index 2ba0a08..108b0da 100644 --- a/Sources/JNISwift/SwiftJNI.swift +++ b/Sources/JNI/SwiftJNI.swift @@ -11,10 +11,7 @@ public func JNI_OnLoad(jvm: UnsafeMutablePointer, reserved: UnsafeMutabl jni = localJNI // set the global for use elsewhere - #if !os(Android) && swift(>=4) - // FIXME: Only available in Swift 4.0 - DispatchQueue.setThreadDetachCallback(JNI_DetachCurrentThread) - #endif + // DispatchQueue.setThreadDetachCallback(JNI_DetachCurrentThread) return JNI_VERSION_1_6 } @@ -52,43 +49,60 @@ extension JNI { return string } - // MARK: References + // MARK: Classes and Methods - public func NewGlobalRef(object: JavaObject) -> JavaObject? { + public func GetMethodID(for object: JavaObject, methodName: String, methodSignature: String) throws -> JavaMethodID { let _env = self._env - let result = _env.pointee.pointee.NewGlobalRef(_env, object) + let objectClass = _env.pointee.pointee.GetObjectClass(_env, object) + try checkAndThrowOnJNIError() + + guard let result = _env.pointee.pointee.GetMethodID(_env, objectClass!, methodName, methodSignature) else { + throw InvalidMethodID() + } + + try checkAndThrowOnJNIError() return result } - // MARK: Classes and Methods - - public func FindClass(className: String) -> JavaClass? { + public func GetStaticMethodID(for javaClass: JavaClass, methodName: String, methodSignature: String) throws -> JavaMethodID { let _env = self._env - let result = _env.pointee.pointee.FindClass(_env, className) + guard let result = _env.pointee.pointee.GetStaticMethodID(_env, javaClass, methodName, methodSignature) else { + throw InvalidMethodID() + } + + try checkAndThrowOnJNIError() return result } - public func GetMethodID(for object: JavaObject, methodName: String, methodSignature: String) throws -> JavaMethodID? { + public func CallVoidMethod(_ method: JavaMethodID, on object: JavaObject, parameters: [JavaParameter]) throws { let _env = self._env - let objectClass = _env.pointee.pointee.GetObjectClass(_env, object) + var methodArgs = parameters + _env.pointee.pointee.CallVoidMethod(_env, object, method, &methodArgs) try checkAndThrowOnJNIError() + } - let result = _env.pointee.pointee.GetMethodID(_env, objectClass!, methodName, methodSignature) + public func CallBooleanMethod(_ method: JavaMethodID, on object: JavaObject, parameters: [JavaParameter]) throws -> JavaBoolean { + let _env = self._env + var methodArgs = parameters + let result = _env.pointee.pointee.CallBooleanMethod(_env, object, method, &methodArgs) try checkAndThrowOnJNIError() return result } - public func GetStaticMethodID(for javaClass: JavaClass, methodName: String, methodSignature: String) throws -> JavaMethodID? { + public func CallIntMethod(_ method: JavaMethodID, on object: JavaObject, parameters: [JavaParameter]) throws -> JavaInt { let _env = self._env - let result = _env.pointee.pointee.GetStaticMethodID(_env, javaClass, methodName, methodSignature) + var methodArgs = parameters + let result = _env.pointee.pointee.CallIntMethod(_env, object, method, &methodArgs) try checkAndThrowOnJNIError() return result } - public func CallVoidMethod(_ method: JavaMethodID, on object: JavaObject, parameters: [JavaParameter]) { + public func CallDoubleMethod(_ method: JavaMethodID, on object: JavaObject, parameters: [JavaParameter]) throws -> JavaDouble { let _env = self._env var methodArgs = parameters - _env.pointee.pointee.CallVoidMethod(_env, object, method, &methodArgs) + let result = _env.pointee.pointee.CallDoubleMethod(_env, object, method, &methodArgs) + try checkAndThrowOnJNIError() + return result } public func CallObjectMethod(_ method: JavaMethodID, on object: JavaObject, parameters: [JavaParameter]) throws -> JavaObject { @@ -99,6 +113,8 @@ extension JNI { return result } + // MARK: Static methods + public func CallStaticObjectMethod(_ method: JavaMethodID, on javaClass: JavaClass, parameters: [JavaParameter]) throws -> JavaObject { let _env = self._env var methodArgs = parameters @@ -123,16 +139,27 @@ extension JNI { return result } - public func CallStaticBooleanMethod(javaClass: JavaClass, method: JavaMethodID, parameters: [JavaParameter]) -> JavaBoolean { + public func CallStaticDoubleMethod(_ method: JavaMethodID, on javaClass: JavaClass, parameters: [JavaParameter]) throws -> JavaDouble { + let _env = self._env + var methodArgs = parameters + let result = _env.pointee.pointee.CallStaticDoubleMethodA(_env, javaClass, method, &methodArgs) + try checkAndThrowOnJNIError() + return result + } + + public func CallStaticBooleanMethod(javaClass: JavaClass, method: JavaMethodID, parameters: [JavaParameter]) throws -> JavaBoolean { let _env = self._env var methodArgs = parameters - return _env.pointee.pointee.CallStaticBooleanMethodA(_env, javaClass, method, &methodArgs) + let result = _env.pointee.pointee.CallStaticBooleanMethodA(_env, javaClass, method, &methodArgs) + try checkAndThrowOnJNIError() + return result } - public func CallStaticVoidMethod(javaClass: JavaClass, method: JavaMethodID, parameters: [JavaParameter]) { + public func CallStaticVoidMethod(javaClass: JavaClass, method: JavaMethodID, parameters: [JavaParameter]) throws { let _env = self._env var methodArgs = parameters _env.pointee.pointee.CallStaticVoidMethodA(_env, javaClass, method, &methodArgs) + try checkAndThrowOnJNIError() } // MARK: Arrays @@ -287,8 +314,7 @@ public struct JavaCallback { guard let javaClass = jni.GetObjectClass(obj: globalJobj), - let methodIDwithoutError = try? jni.GetMethodID(for: javaClass, methodName: methodName, methodSignature: methodSignature), - let methodID = methodIDwithoutError + let methodID = try? jni.GetMethodID(for: javaClass, methodName: methodName, methodSignature: methodSignature) else { // XXX: We should throw here and keep throwing til it gets back to Java fatalError("Failed to make JavaCallback") @@ -299,7 +325,7 @@ public struct JavaCallback { } public func apply(args: [JavaParameter]) { - jni.CallVoidMethod(methodID, on: jobj, parameters: args) + try? jni.CallVoidMethod(methodID, on: jobj, parameters: args) } /// Send variadic parameters to the func that takes an array diff --git a/Sources/JNISwift/Array+JavaParameterConvertible.swift b/Sources/JNISwift/Array+JavaParameterConvertible.swift deleted file mode 100644 index 7c28f6d..0000000 --- a/Sources/JNISwift/Array+JavaParameterConvertible.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// Array+JavaParameterConvertible.swift -// JNISwift -// -// Created by flowing erik on 19.07.17. -// - -extension Array where Element == JavaParameterConvertible { - func methodSignature(returnType: JavaParameterConvertible.Type? = nil) -> String { - return getMethodSignature(from: self, reducer: { - return $0 + type(of: $1).asJNIParameterString - }, returnType: returnType) - } -} - -extension Array where Element == JavaParameterConvertible.Type { - func methodSignature(returnType: JavaParameterConvertible.Type? = nil) -> String { - return getMethodSignature(from: self, reducer: { - return $0 + $1.asJNIParameterString - }, returnType: returnType) - } -} - -private func getMethodSignature(from arr: [T], reducer: (String, T) -> String, returnType: JavaParameterConvertible.Type?) -> String { - let argumentTypes = arr.reduce("", reducer) - return argumentTypes.asJNIParameterString(with: returnType) -} - -private extension String { - func asJNIParameterString(with returnType: JavaParameterConvertible.Type?) -> String { - let returnTypeString = returnType?.asJNIParameterString ?? "V" - return "(" + self + ")" + returnTypeString - } -} diff --git a/Sources/JNISwift/JNIMethods.swift b/Sources/JNISwift/JNIMethods.swift deleted file mode 100644 index 0322a90..0000000 --- a/Sources/JNISwift/JNIMethods.swift +++ /dev/null @@ -1,72 +0,0 @@ -import CJNI - -struct InvalidParameters: Error {} - -extension String { - func replacingFullstopsWithSlashes() -> String { - let replacedCharacters = self.characters.map { ($0 == ".") ? "/" : $0 } - return String(String.CharacterView(replacedCharacters)) - } -} - -extension JNI { - - // MARK: Static Methods - - public func callStatic(_ methodName: String, on javaClass: JavaClass, arguments: [JavaParameterConvertible]) throws { - let methodSignature = arguments.methodSignature() - - guard let methodID = try jni.GetStaticMethodID(for: javaClass, methodName: methodName, methodSignature: methodSignature) - else { throw InvalidParameters() } - - jni.CallStaticVoidMethod(javaClass: javaClass, method: methodID, parameters: arguments.map { $0.toJavaParameter() }) - } - - public func callStatic(_ methodName: String, on javaClass: JavaClass, arguments: [JavaParameterConvertible]) throws -> T { - let methodSignature = arguments.methodSignature(returnType: T.self) - - guard let methodID = try jni.GetStaticMethodID(for: javaClass, methodName: methodName, methodSignature: methodSignature) - else { throw InvalidParameters() } - - let javaParameters = arguments.map { $0.toJavaParameter() } - return try T.fromStaticMethod(calling: methodID, on: javaClass, args: javaParameters) - } - - - public func callStatic(_ methodName: String, on javaClass: JavaClass, returningObjectType objectType: String) throws -> JavaObject { - let methodSignature = "()L\(objectType.replacingFullstopsWithSlashes());" - - guard let methodID = try jni.GetStaticMethodID(for: javaClass, methodName: methodName, methodSignature: methodSignature) else { - throw InvalidParameters() - } - - return try jni.CallStaticObjectMethod(methodID, on: javaClass, parameters: []) - } - - - // MARK: Non-Static Methods - - public func call(_ methodName: String, on object: JavaObject, returningObjectType objectType: String) throws -> JavaObject { - let methodSignature = "()L\(objectType.replacingFullstopsWithSlashes());" - - guard let methodID = try jni.GetMethodID(for: object, methodName: methodName, methodSignature: methodSignature) else { - throw InvalidParameters() - } - - return try jni.CallObjectMethod(methodID, on: object, parameters: []) - } - - - public func call(_ methodName: String, on object: JavaObject, with arguments: [JavaParameterConvertible]) throws -> [String] { - let argumentsSignature = arguments.reduce("", { $0 + type(of: $1).asJNIParameterString }) - let methodSignature = "(" + argumentsSignature + ")" + "[" + String.asJNIParameterString - - guard let methodID = try jni.GetMethodID(for: object, methodName: methodName, methodSignature: methodSignature) else { throw InvalidParameters() } - - let javaParameters = arguments.map { $0.toJavaParameter() } - let returnedArray = try jni.CallObjectMethod(methodID, on: object, parameters: javaParameters) - - return try jni.GetStrings(from: returnedArray) - } - -} diff --git a/Sources/JNISwift/JNIObjects.swift b/Sources/JNISwift/JNIObjects.swift deleted file mode 100644 index 029d398..0000000 --- a/Sources/JNISwift/JNIObjects.swift +++ /dev/null @@ -1,26 +0,0 @@ -import CJNI - -public extension JNI { - - public func AllocObject(targetClass: JavaClass) -> JavaObject { - let env = self._env - return env.pointee.pointee.AllocObject(env, targetClass)! - } - - public func NewObject(targetClass: JavaClass, _ methodID: JavaMethodID, _ args: JavaParameter...) -> JavaObject { - return self.NewObject(targetClass: targetClass, methodID, args) - } - - public func NewObject(targetClass: JavaClass, _ methodID: JavaMethodID, _ args: [JavaParameter]) -> JavaObject { - let env = self._env - var mutableArgs = args - return env.pointee.pointee.NewObject(env, targetClass, methodID, &mutableArgs)! - } - - public func GetObjectClass(obj: JavaObject) -> JavaClass? { - let env = self._env - let result = env.pointee.pointee.GetObjectClass(env, obj) - return (result != nil) ? result : .none - } - -} diff --git a/Sources/JNISwift/JavaParameterConvertible.swift b/Sources/JNISwift/JavaParameterConvertible.swift deleted file mode 100644 index f7e140e..0000000 --- a/Sources/JNISwift/JavaParameterConvertible.swift +++ /dev/null @@ -1,53 +0,0 @@ -// -// JavaParameterConvertible.swift -// JNISwift -// -// Created by flowing erik on 19.07.17. -// - -import CJNI -public protocol JavaParameterConvertible { - typealias JavaMethod = ((JavaParameterConvertible...) throws -> Self) - static var asJNIParameterString: String { get } - func toJavaParameter() -> JavaParameter - static func fromStaticMethod(calling methodID: JavaMethodID, on javaClass: JavaClass, args: [JavaParameter]) throws -> Self -} - -extension Bool: JavaParameterConvertible { - public static var asJNIParameterString: String { return "Z" } - - public func toJavaParameter() -> JavaParameter { - return JavaParameter(bool: (self) ? 1 : 0) - } - - public static func fromStaticMethod(calling methodID: JavaMethodID, on javaClass: JavaClass, args: [JavaParameter]) throws -> Bool { - return jni.CallStaticBooleanMethod(javaClass: javaClass, method: methodID, parameters: args) == 1 - } -} - -extension Int: JavaParameterConvertible { - public static var asJNIParameterString: String { return "I" } - - public func toJavaParameter() -> JavaParameter { - return JavaParameter(int: JavaInt(self)) - } - - public static func fromStaticMethod(calling methodID: JavaMethodID, on javaClass: JavaClass, args: [JavaParameter]) throws -> Int { - let result = try jni.CallStaticIntMethod(methodID, on: javaClass, parameters: args) - return Int(result) - } -} - -extension String: JavaParameterConvertible { - public static var asJNIParameterString: String { return "Ljava/lang/String;" } - - public func toJavaParameter() -> JavaParameter { - let stringAsObject = jni.NewStringUTF(self) - return JavaParameter(object: stringAsObject) - } - - public static func fromStaticMethod(calling methodID: JavaMethodID, on javaClass: JavaClass, args: [JavaParameter]) throws -> String { - let jObject = try jni.CallStaticObjectMethod(methodID, on: javaClass, parameters: args) - return jni.GetString(from: jObject) - } -} diff --git a/build.sh b/build.sh deleted file mode 100755 index 14e21f3..0000000 --- a/build.sh +++ /dev/null @@ -1,8 +0,0 @@ -export PATH=$PATH:~/.swiftyrobot - -# ensure working dir is local to this script (when being called by another script) -cd "$(dirname "$0")" - -# build Swift Package with Swifty Robot -sr build | sed 's/\/root\/host_fs//g' -exit ${PIPESTATUS[0]}