[swift-dev] C API Annotations outside of original header?
Geordie Jay
geojay at gmail.com
Sun Jul 17 18:10:13 CDT 2016
Is it possible that apinotes only works for Objective C? The only docs I've
seen regarding them explicitly mention ObjC repeatedly
Saleem Abdulrasool <compnerd at compnerd.org> schrieb am Mo., 18. Juli 2016 um
00:43:
> On Sun, Jul 17, 2016 at 1:39 PM, Geordie J via swift-dev <
> swift-dev at swift.org> wrote:
>
>> 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.
>>
>
> AIUI, apinotes were designed specifically to address this need. You
> should be able to augment the header with an apinotes set for that header.
>
>
>> 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
>>
>> Thanks,
>> Geordie
>>
>> _______________________________________________
>> swift-dev mailing list
>> swift-dev at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-dev
>>
>>
>
>
> --
> Saleem Abdulrasool
> compnerd (at) compnerd (dot) org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20160717/7e5af5f3/attachment.html>
More information about the swift-dev
mailing list