[swift-dev] C API Annotations outside of original header?

Saleem Abdulrasool compnerd at compnerd.org
Sun Jul 17 18:23:22 CDT 2016


On Sun, Jul 17, 2016 at 4:10 PM, Geordie Jay <geojay at gmail.com> wrote:

> Is it possible that apinotes only works for Objective C? The only docs
> I've seen regarding them explicitly mention ObjC repeatedly


I would find that hard to believe given that it is used for importing
libdispatch (C) into Swift.


> 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
>>
>


-- 
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20160717/1cc24fdd/attachment.html>


More information about the swift-dev mailing list