Hi, I’m hoping to add CF_SWIFT_NAME annotations to an imported Clang module 
(JNI) without editing the original header file itself. Is this possible, or is 
there a working alternative other than creating a Swift wrapper? Maybe this is 
trivial but C is not my strong point.

Specifically, there are a bunch of type names in the Android JNI that I’d 
rather just keep „Swifty“ (the CF_SWIFT_NAME additions are my own of course, 
working with a copy of the original file for now):

typedef unsigned char                   jboolean; // can be 0 or 1 - is this 
the same as CFBoolean?
typedef signed char                     jbyte CF_SWIFT_NAME(Int8);
typedef unsigned short                  jchar CF_SWIFT_NAME(UInt8);
typedef short                           jshort CF_SWIFT_NAME(Int16);
typedef int                                     jint CF_SWIFT_NAME(Int32);
typedef long long                       jlong CF_SWIFT_NAME(Int);
typedef float                                   jfloat CF_SWIFT_NAME(Float);
typedef double                          jdouble CF_SWIFT_NAME(Double);


Note that there’s no good way of wrapping these in pure Swift, as far as I can 
see (they show up throughout the rest of the APIs). Also, it’d be great if the 
following was possible from outside the header. Instead of:

typedef enum jobjectRefType {
    JNIInvalidRefType = 0,
    JNILocalRefType = 1,
    JNIGlobalRefType = 2,
    JNIWeakGlobalRefType = 3
} jobjectRefType;

… to use:

typedef NS_ENUM(NSInteger, jobjectRefType) {
    JNIInvalidRefType CF_SWIFT_NAME(invalid) = 0,
    JNILocalRefType CF_SWIFT_NAME(local) = 1,
    JNIGlobalRefType CF_SWIFT_NAME(global) = 2,
    JNIWeakGlobalRefType CF_SWIFT_NAME(weakGlobal) = 3
};


The final question is whether it’s at all possible to annotate this kind of API:

struct JNINativeInterface {
    jclass      (*DefineClass)(JNIEnv*, const char*, jobject, const jbyte*,
                        jsize);
    // and about 100 more of these ...
}

This imports into Swift as jni.DefineClass(env, string, obj, bytes, size). 
Attempting to put a type annotation into the header results like this:

jclass (*DefineClass)(JNIEnv*, const char*, jobject, const jbyte*, size)
        CF_SWIFT_NAME(defineClass(env:name:object:byteContents:size:));

results in a strange warning: "‚swift_name‘ attribute has invalid identifier 
for base name“. It is possible to just rename DefineClass to e.g. defineClass, 
via CF_SWIFT_NAME(defineClass); I assume this is because this is a function 
pointer on a struct rather than a global function.

Any help regarding the above would be much appreciated. Playing around with 
those changes locally has made huge improvements to the readability of 
Android/JNI-specific Swift code. If I can find a clean solution to this I’d 
like to finally clean up and upstream the SwiftJNI module I started here: 
https://github.com/SwiftAndroid/swift-jni 
<https://github.com/SwiftAndroid/swift-jni>

Thanks,
Geordie

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to